Sari la conținut
ELFORUM - Forumul electronistilor

Intrebari despre lock biti


mitescu

Postări Recomandate

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
  • Răspunsuri 8
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • nana

    4

  • mitescu

    3

  • Laci

    1

  • ratza

    1

Top autori în acest subiect

  • 2 săptămâni mai târziu...

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

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

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 :nebunrau: 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

scuzati duble postul problema era alta ... eu foloseam o variabila locala Indexul astfel incat la fiecare intrerupere aceea variabila se reinitializa. :101

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

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 cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări