atmega8 uart
Napsal: 28 pro 2012, 22:51
zdravím po roce jsem se pokusil vrátit naprogramovat atmegu na přijímání dat ze sériového portu, ale pořád mi to nechodí. Nemám v tom velké zkušenosti a nikdo mi v tom jinak neporadí, takže to dělám pokus omyl. Pokusil jsem se to nataktovat s krystalem, ale povedlo se mi takhle 3 atmegám zablokovat pojistky, zkoušel jsem to podle http://www.engbedded.com/fusecalc/ a na 4 mhz oscilátor jsem nastavil Hfuse d9 a lfuse ec, nevím je to takový zmatený a prý to jde těžko odemknout, asi to není tak jednoduché rozchodit bez dlouholetých zkušeností. Tak jsem se ten problém pokusil obejít tím, že budu do atmegy posílat kód po 2 linkách, jeden bude jako kontrola a jeden bude posílat 0 a jedničky. Takže to funguje tak že TxD zapnu a přes Dtr pošlu jedničku nebo nulu. Atmega to přičte a stojí dokud se Txd nevypne a znovu nezapne. a Chtěl bych s tím řídit zatím jen diodu. Funguje to, ale špatně. Špatně se to sečítá, zkoušel jsem jak dekadicky, tak hexagonálně. Vždycky to dojede jen do 5 iterace a začne blikat, ale ty časy tomu neodpovídají, nevíte co s tím někdo?
Díky
(code)
#include <avr/io.h>
#include <util/delay.h>
#define F_CPU 1000000UL
int main (void)
{
DDRB = 0x13;
int j=0x00;
int k;
loop_until_bit_is_clear(PINB,2);
if(bit_is_set(PINB,3))
{j=0x01;}
loop_until_bit_is_set(PINB,2);
loop_until_bit_is_clear(PINB,2);
if(bit_is_set(PINB,3))
{j = j + 0x02;}
loop_until_bit_is_set(PINB,2);
loop_until_bit_is_clear(PINB,2);
if(bit_is_set(PINB,3))
{j= j + 0x04;}
loop_until_bit_is_set(PINB,2);
loop_until_bit_is_clear(PINB,2);
if(bit_is_set(PINB,3))
{j= j + 0x08;}
loop_until_bit_is_set(PINB,2);
loop_until_bit_is_clear(PINB,2);
if(bit_is_set(PINB,3))
{j = j + 0x10;}
loop_until_bit_is_set(PINB,2);
loop_until_bit_is_clear(PINB,2);
if(bit_is_set(PINB,3))
{j= j+0x20;}
loop_until_bit_is_set(PINB,2);
loop_until_bit_is_clear(PINB,2);
if(bit_is_set(PINB,3))
{j = j+ 0x40;}
loop_until_bit_is_set(PINB,2);
loop_until_bit_is_clear(PINB,2);
PORTB = 0x02;
if(bit_is_set(PINB,3))
{j= j+0x80;}
while(1)
{
PORTB = 0x01;
k=0;
while(1){
_delay_ms(1);
k++;
if(k==j)break;
}
PORTB = 0x00;
k=0;
while(1){
_delay_ms(1);
k++;
if(k==j)break;
}
}
return 0;
}
(/code)
Díky
(code)
#include <avr/io.h>
#include <util/delay.h>
#define F_CPU 1000000UL
int main (void)
{
DDRB = 0x13;
int j=0x00;
int k;
loop_until_bit_is_clear(PINB,2);
if(bit_is_set(PINB,3))
{j=0x01;}
loop_until_bit_is_set(PINB,2);
loop_until_bit_is_clear(PINB,2);
if(bit_is_set(PINB,3))
{j = j + 0x02;}
loop_until_bit_is_set(PINB,2);
loop_until_bit_is_clear(PINB,2);
if(bit_is_set(PINB,3))
{j= j + 0x04;}
loop_until_bit_is_set(PINB,2);
loop_until_bit_is_clear(PINB,2);
if(bit_is_set(PINB,3))
{j= j + 0x08;}
loop_until_bit_is_set(PINB,2);
loop_until_bit_is_clear(PINB,2);
if(bit_is_set(PINB,3))
{j = j + 0x10;}
loop_until_bit_is_set(PINB,2);
loop_until_bit_is_clear(PINB,2);
if(bit_is_set(PINB,3))
{j= j+0x20;}
loop_until_bit_is_set(PINB,2);
loop_until_bit_is_clear(PINB,2);
if(bit_is_set(PINB,3))
{j = j+ 0x40;}
loop_until_bit_is_set(PINB,2);
loop_until_bit_is_clear(PINB,2);
PORTB = 0x02;
if(bit_is_set(PINB,3))
{j= j+0x80;}
while(1)
{
PORTB = 0x01;
k=0;
while(1){
_delay_ms(1);
k++;
if(k==j)break;
}
PORTB = 0x00;
k=0;
while(1){
_delay_ms(1);
k++;
if(k==j)break;
}
}
return 0;
}
(/code)