mitescu Postat Ianuarie 10, 2010 Partajează Postat Ianuarie 10, 2010 Am citit undeva (nu-mi aduc aminte unde) precum ca s-ar putea sa se citeasca lock bitii si/sau semnatura de la AVR-uri software (soft-ul din MC) . Si acum intrebarea: Stie cineva cum se face ? Link spre comentariu
Laci Postat Ianuarie 10, 2010 Partajează Postat Ianuarie 10, 2010 Fuse si lock biti se pot citi, cauta in pdf-uri: Reading the Fuse and Lock Bits from Software, despre semnatura nu scrie. Eu am vrut sa modific odata prin soft fusebiti dar fara succes. Link spre comentariu
mitescu Postat Ianuarie 10, 2010 Autor Partajează Postat Ianuarie 10, 2010 Scuze , am scris prostii, pentru citirea semnaturii era intrebarea iar ptr lock biti ma interesa scrierea. Link spre comentariu
nana Postat Ianuarie 20, 2010 Partajează Postat Ianuarie 20, 2010 Ca sa nu mai deschid inca un topic nou pentu o intrebare rog pe domnu mitescu sa imi permita sa o adresez in acest topic. Am urmatoarea problema cu o intrerupere de UART pe un atmega128. Deci codul trebuie sa execute urmatorul algoritm. La primirea unui octet pe seriala se apeleaza intreruperea iar receptionarea caracterului 'k' marcheaza inceputul transmiterii unei comenzi valide. Atunci eu trimit de 5 ori aceasi comanda(pentru ca o trimit pe un canal cu perturbati mari) si o pun intr-un buffer. Verific de cate ori apare aceasta comanda in buffer si validez comanda. daca imi apare de minimi 3 ori din 5 inseamna ca este o comanda valida si o execut. In fine asta e tot algoritmu. Problema e ca la receptie functioneaza intreruperile dar nu imi iese din bucla de intruperi.Varianbila buffer si status sunt declarate global.ISR(USART0_RX_vect){ uint8_t bufferIndex; uint8_t data=UDR0;switch (data){case ('k'): status=1;bufferIndex=0;break;if(!status) break; buffer[bufferIndex++]=data;} if(bufferIndex==4) { status=0; //validare(); }}int main(void){TCCR1A=0xA0;TCCR1B=0x12;TCNT1H=0x00;TCNT1L=0x00;ICR1=20000;OCR1A=1500;OCR1B=1500;OCR1CH=0x00;OCR1CL=0x00;PORTB=0x00;DDRB=0x60;UART0_Init();sei();while(1){ if(!status)validare();}} Link spre comentariu
ratza Postat Ianuarie 20, 2010 Partajează Postat Ianuarie 20, 2010 Problema s-ar putea s? apar? din cauza if-ului ?luia din switch. Link spre comentariu
nana Postat Ianuarie 20, 2010 Partajează Postat Ianuarie 20, 2010 la care te referi la ala din if(!status) sau la ala care verifica daca sau primit 5 comenzi ?! Link spre comentariu
mitescu Postat Ianuarie 20, 2010 Autor Partajează Postat Ianuarie 20, 2010 case ('k'): status=1; bufferIndex=0; break; -->> -----------------------------------v if(!status) break; <<----- ptr cine break; anterior a fost, si alt case nu exista! buffer[bufferIndex++]=data Efectul va fi ca status va iesi numai in 1 , de aci incrementarea indexului nu se va face niciodata. Link spre comentariu
nana Postat Ianuarie 20, 2010 Partajează Postat Ianuarie 20, 2010 case ('k'): status=1; bufferIndex=0; break; -->> -----------------------------------v if(!status) break; <<----- ptr cine break; anterior a fost, si alt case nu exista! buffer[bufferIndex++]=data Efectul va fi ca status va iesi numai in 1 , de aci incrementarea indexului nu se va face niciodata.Da ai dreptate cat de prost sunt Defapt acolo trebuia sa scriu default.. status=1; bufferIndex=0; break; -->> -----------------------------------v default: if(!status) break; <<----- ptr cine break; anterior a fost, si alt case nu exista! buffer[bufferIndex++]=data; Si atunci iese din case si incrementeaza bufferu si adauga date. Link spre comentariu
nana Postat Ianuarie 21, 2010 Partajează Postat Ianuarie 21, 2010 scuzati duble postul problema era alta ... eu foloseam o variabila locala Indexul astfel incat la fiecare intrerupere aceea variabila se reinitializa. Astfel codu arata asa : uint8_t bufferIndex; ISR(USART0_RX_vect) { uint8_t i; uint8_t data=UDR0; if(data=='k') {status=1; bufferIndex=0; } if(status==1 && data!='k') buffer[bufferIndex++]=data; if(bufferIndex==5 && status==1) { for(i=0;i<5;i++) printf("B[%d] = %c",i,buffer); status=0; validare(); } } Link spre comentariu
Postări Recomandate
Creează un cont sau autentifică-te pentru a adăuga comentariu
Trebuie să fi un membru pentru a putea lăsa un comentariu.
Creează un cont
Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!
Înregistrează un nou contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum