Jump to content
ELFORUM - Forumul Electronistilor
Sign in to follow this  
Guest stefan_v

AVR-uri cu probleme

Recommended Posts

Guest stefan_v

De ceva vreme vreau sa trec la AVR-uri.Pana acum am lucrat 8051 si a fost ok.Am facut chestii destul de incalcite si n-au fost probleme, am reusit sa duc toate proiectele pana la sfarsit.Pentru AVR-uri am luat AVRSudio 4.11 de la Atmel de pe site si l-am instalat.Am instalat si service pack-ul de acolo.Am incercat sa scriu in asamblare un program care aprinde un LED cu semnal dreptunghiular, atunci cand, la unul dintre porturi, pun un pin la Vcc.Am scris prima data pentru Atmega8 si n-a mers.Mai exact...apelam o subrutina "timer" si dupa ce o executa, programul nu se mai intorcea de unde ramasese, sarea la org00000.Programul l-am tot aranjat pana n-am mai avut erori sau atentionari.Functioneaza fara probleme si in modul debugger.Nu prea inteleg, de ce dupa ce executa "RETI", sare la inceputul programului, trebuie sa sara unde a ramas programul.Si cand salveaza in stiva , parca face niste chestii cam aiurea.Instructiunile sunt toate pentru Atmega8.Daca am vazut ca n-o scot la capat cu Atmega8, am zis ca trebuie sa iau un procesor mai simplu si am ales AT90S1200.Am incercat acelasi program de la Atmega8 cu niste mici modificari pentruAT90S1200.Pana la urma n-am mai avut nici o eroare si modul debbuger a mers foarte frumos.Si aici au fost probleme.Cand bag hex-ul programului in circuitul cu pricina, programul nu mai merge.Ajunge pana la o instructiune "SBIS" unde ar trebui sa sara si sa vada butonul de comanda al LED-ului.Ei bine...nu vede acel pin (la portul D) ca pe o comanda si programul ramane intr-o stare neclara.Am setat corect DDRD ca intrare pentru buton si iesire pentru LED.Programul in debbuger mod am vazut ca stie sa se intoarca din subrutina acolo unde trebuie.La programul pentru Atmega8 nu stia acest lucru.In debugger mod, pas cu pas, programul merge foarte frumos.Programul citeste un pin la portul D si daca este 1, atunci sare la o subrutina si executa niste temporizari.Daca pinul este zero, atunci comanda la LED este zero. O chestie mai simpla de atat nu se poate si totusi nu merge.Programatorul este destul de bun, unul industrial, ma lasa sa fac fuse-uri si altele in fel si chip, exact asa cum vreau eu.Ceva nu este in regula, nu sunt recunoscute niste instructiuni destul de clare, de exemplu RCALL la un procesor il face, la altul nu vrea de nici un chip.Nu citeste un pin pe unul dintre porturi si probabil ca exista multe nereguli de felul acesta.8051 este foarte cuminte si n-am avut niciodata probleme de felul acesta. Poate stie cineva si imi spune si mie ce si cum, ca eu unul nu mai stiu.Nu ma asteptam la probleme de felul acesta.Daca sunteti interesati si credeti ca este necesar pentru a va da seama, pot posta programul aici pentru a va da cu parerea.Poate mai sunt si altii care au patit lucruri de genul acesta.Cred ca trebuie dezbatuta putin problema.Va multumesc foarte mult !

Share this post


Link to post
Share on other sites

O eroare destul de comuna la lucrul cu portul e urmatoarea, si eu am patit-o:la scriere, lucrezi cu PORTx, dar la citire trebuie sa lucrezi cu PINx. Daca lucrezi cu pinii care sunt si interfata de JTAG, ai grija sa dezactivezi interfata, altfel functiile alternante de pin iti fac override pe functiile care vrei tu sa le folosesti.In rest, si eu am patit cu comportamente ciudate, dar mi-am dat seama ca sunt eu de vina (setari incorecte prin registrii). In rest, chestii total inexplicabile nu am avut (am lucrat cu ATMega 32, 64, funcard)/pisoiu

Share this post


Link to post
Share on other sites
Guest stefan_v

E bine cum zici.Am vazut totusi o chestie interesanta.Daca DDRD este 1, atunci portul si chiar pinul respectiv este iesire.Daca DDRD este 0, atunci pinul respectiv este intrare.Daca un pin de intrare se schimba din unu in zero si DDRD este setat 0, deci citeste pinul la portul respectiv, nu se schimba si bitul de la PINx.Daca se schimba , era simplu, il citeam de acolo, de la PINx.Cred ca inca nu stiu niste lucruri foarte importante despre AVR-uri.Te rog sa-mi explici un pic mai pe larg care-i povestea cu cititul unui pin la un port.Poate ai putin timp, te rog !Iti multumesc tare mult !

Share this post


Link to post
Share on other sites

8051 nu are registru de directie. Daca pui 1 logic pe port la 8051, citirea din acelasi registru iti da starea portului. La avr ai port de directie. Daca portul de directie are vreun pin pe iesire, atunci ce scrii pe PORTx iti apare pe pin, iar ce citesti de la PINx e irelevant, daca faci ceva cu pinul ala din exterior, nu vei vedea starea in PINx atata timp cat portul e setat pe iesire. Mai mult, daca portul e setat ca iesire si fortezi din exterior pinul in alta stare logica, poate ai sanse sa il si prajesti. Daca il setezi ca intrare, atunci daca scrii 1 pe pinul respectiv in PORTx, activezi rezistorul pullup, iar starea pinului o vei regasi in PINx. Iti recomand sa citesti documentatia Atmel, eu de acolo m-am lamurit cu toate aspectele. Ai mare grija la functiile alternante pe pini, sa fie dezactivate. Eu am muscat-o cu jtag-ul, am folosit un pin de acolo ca si iesire de comanda (cred ca era TCK), si eu una faceam din soft, dar cu osciloscopul vedeam niste aberatii pe pin, nu starea in 1 logic. Pana nu am dezactivat jtag-ul atat din fuse cat si din registrii interni, nu l-am convins. Eu zic sa nu iti formezi pareri gresite despre AVR, si eu am lucrat f. mult si lucrez in continare cu 51, dar a trebuit sa ma iau si de AVR, iar trecerea nu e chiar asa simpla. Sunt multe detalii prin registrii speciali, detalii care trebuie sa le iei cate una odata si sa le aprofundezi, altfel de dai cu capul de tot felul de chestii ciudate.Spor la treaba.

Share this post


Link to post
Share on other sites

Prima problema de care se lovesc cei ce trec de la MCS51 la Atmel AVR este initializarea stivei,(SPL si unde este cazul SPH) l Avr-ul care nu necesita intializarea stivei este AT90S1200, care are stiva ,ATENTIE ,hardware si pe 3 NIVELE (atat) . Asta poate fi o explicatie ca la ATMEGA8 nu a mers (jmp la 00h) si la 1200 da.In ceea ce priveste DDR-urile PORT si PIN aici multa lume se pacaleste.Are dreptate Pisoiu, dar atentie cand DDR-ul respectiv este in 0 un SBIC sau SBIS la portx,y va aduce de fapt pull-up-ul (care in acest caz este determinat de valoarea de la PORTx,y,0 fara pull-up 1- cu pull-up) la "interval", cand DDR-ul este 1 si citesti PINx,y, de fapt citesti ceea ce ai scris in PORTx,y. Asta este o smecherie de control a liniilor de iesire in RUN (daca nbu apar scurturi, conflicte etc). Daca tot lucrezi cu AVR-Studio, vezi ca ai posibilitatea urmariri tuturor evenimentelor(watch-uri, fortari etc..). Din combinatiile acestora iti poti da sema unde ai gresit. Mai este o capcana ptr cei care sunt obisnuiti cu MCS51. Lucrul pe bit, care la AVR nu este atat de dezvoltat, si deseori iei "plasa"Este simplu si curat. Fata de MCS51 , care are bitii de stari si setari "stropiti" peste tot, unde vrei si unde nu vrei, AVR-ul este foarte bine organizat d.a.p.d.Succes !

Share this post


Link to post
Share on other sites

Guest stefan_v

Tare chestie. Am cam priceput unde am gresit.Eu am inteles cumva pe dos.Ma voi ocupa in seara asta si va voi tine la curent cu ce-am reusit sa fac.Voi reveni in seara asta sau cel tarziu maine .Sunteti tari, va multumesc tare mult.Poate mai discutam pe cateva teme, este interesant si-mi place.

Share this post


Link to post
Share on other sites
Guest stefan_v

Gata. S-a rezolvat.Totul merge ca la carte. Mai am totusi o mica chestie de lamurit.Am citit un pin de la PORTx pe PINx, cand DDRD a fost zero pe acel bit al portului.Se pare ca merge asa cum trebuie.In AVRStudio 4, cand rulez acest program in debugger mod, nu se schimba starea lui PINx, astfel incat sa vad ca este citita starea lui PORTx, chestie care m-a indus in eroare foarte tare.De aici am tras concluzia ca PORTx se poate citi numai pe PINx.Vreau sa va mai intreb o chestie.Pot scrie in PINx o valoare, sa setez DDRD=1 si sa gasesc acea valoare la iesirea lui PORTx.Eu am facut exact invers, am scris 1 la POTRx, am pus DDRD=1 si am gasit valoarea lui PORTx=1 la PINx=1 dupa un clock distanta. La ce poate folosi aceasta intarziere de un clock.Ce sa zic...vad ca stiti bine aceste lucruri, va multumesc tare mult !

Share this post


Link to post
Share on other sites
Guest stefan_v

Am studiat problema si acum este totul clar.As vrea sa stiu parerea voastra despre AVRStudio 4.11. Daca se comporta aiurea, daca in debugger mod exista situatii pe care nu le face cum trebuie, daca exista procesoare pe care nu le simuleaza cum trebuie.Va multumesc !

Share this post


Link to post
Share on other sites
Guest stefan_v

Momentan studiez cu atentie ce mi-ai zis in legatura cu intoarcerea din subrutina , stiva si altele.M-a surprins o chestie care nu-mi este deloc clara.Ai dat un exemplu de program si ai inceput cu niste chestii de genul:.include "m8def.inc" .include "macro.asm" .include "map.asm" .cseg .org 0 start: rjmp init .org OVF0addr rjmp isr_t0ov init: .include "init.asm" In ce-am citit eu cred ca se numeste "header file "As vrea sa stiu :1)- Ce reprezinta aceste lucruri ?2)- La ce folosesc ? As vrea sa-mi zici cate ceva despre fiecare in parte.Cred ca este cam mult ce vreau dar poate ai putina rabdare .M-am tot uitat pe net dupa aceste lucruri si nu prea am priceput mare lucru.3)-Pot lipsi unele dintre acestea, din AVRStudio 4 si care este efectul asupra programului ?Am inteles de la tine ca unul este deja inclus in AVRStudio 4.4)-Daca aceste file nu fac parte din AVRStudio4, de unde le iau si cum fac astfel incat programul sa aiba acces la aceste file ?Banuiesc cumva la ce folosesc dar nu vreau sa fac presupuneri gresite.5)-Aceste file sunt dedicate pentru fiecare uC in parte, sau merg pentru toate uC-urile ?Ma intereseaza tare mult cartea aceea despre care mi-ai zis tu.Daca nu are un pret iesit din comun, chiar as vrea s-o cumpar.Poate ma ajuti tot tu.Multumesc mult si astept raspunsul tau.Stefan

Share this post


Link to post
Share on other sites

Exemplul pe care l-am dat este luat la intamplare dintr-un program mai vechi al meu.Ca sa pot raspunde la intrebarile tale cat mai scurt sa luam fiecare linie in parte:.include "m8def.inc" Dupa cum am mai spus INC-urile vin odata cu AVRStudio. Functie de MC-ul folosit, incluzi INC-ul corespunzator (ex. 8515def.inc ptr AT90S8515, m128def.inc ptr ATMega128 s.a.m.d.). Toate le gasesti in directorul AVRStudio, subdirectorul "Appnotes". In aceste fisiere se definesc registrii, adresele de salt INT, bitii ..... etc... Tu nu trebuie sa iti bati capul cu ele , trebuie numai sa scrii lina. AVRStudio cand intalneste linia de mai sus, stie calea si include automat fisierul.INCLUDE este o directiva ce include fisierul mentionat in locul unde a fost scrisa.*******************.include "macro.asm" .include "map.asm" Cele doua linii includ doua fisiere cu numele respective. Ele au fost scrise de mine . Existenta lor nu este obligatorie. Pentru claritate nu am scris codul direct aici. El este scris in cele doua fisiere si la asamblare AVRStudio le include automat. Avantajul este ca poti folosi module gata scrise pentru mai multe programe.Oricum MACRo-urile este bine sa le amplasezi aici. AVRStudio este excelent , dar din pacate mai are si bug-uri, si unul din acestea este si amplasarea MACRO. Amplasand macro-urile la inceput scapi de aceasta problema.*****************.cseg Defineste zona de cod. nu este neaparat nevoie de linie dar daca inaintea ei ai avut un.dseg ori un .eseg (data segment , eeprom segment) ai probleme, asa ca mai bine il pui, este si mai corect si mai clar.**************.org 0 Indica adresa de incepere a codului ce urmeaza dupa org. (cred ca nu ai problema d.p.a.d.v)*******************start: rjmp init Salt la adresa de inceput de cod. In continuare sunt vectorii de intrerupere, . Ii gaseti ptr fiecare MCU in datasheet sau in INC-ul de rigoare.*****.org OVF0addr rjmp isr_t0ov - OVF0 addr -este adresa vectorului de intrerupere "timer0overflow" si este definita in INC- isr_t0ov - este adresa de deservire a intreruperii si este definita de mine. Deci rutina de intrerupere este la adresa isr_t0ov:****************init: .include "init.asm" De aici incepe codul."init.asm" este scris de mine si contine initializari (SP, timer,adc...)********Concluzie : nimic nu este obligatoriu. Insa respectarea unor reguli de tipul acesta usureaza munca si o simplifica prin claritatea programului Iti inchipui cum ar arata un program care are linii de tipul: rjmp 0x12.org 0x04 rjmp 0xea ldi 0x5f,0x04 out 0x3e,0x5f......Infricosator , NU?In general modulele sunt scrise de catre utilizator (mai putin INC-ul). Se pot gasi si module gata scrise dar , in cele mai multe cazuri nu se "pupa" cu ceea ce vrei sa faci. Pe de alta parte este bine sa le studiezi. Asta iti ajuta la invatarea lucrului cu MC. De asemenea poti vedea rezolvari de probleme in mai multe moduri.Cartea o gaseti la AMAZON.com sau la toate Amazoanele (de,fr,ca,uk...) si are un pret nesimtit. De ajutat nu pot sa te ajut cu ea ptr ca am numai doua exemplare. Atat.Succes.

Share this post


Link to post
Share on other sites

Guest stefan_v

Am citit de mai multe ori ce mi-ai scris.Cred ca trebuie sa trec acele lucruri la inceputul programului si AVRStudio 4 stie singur ce trebuie sa faca.Cred ca nu mai trebuie sa iau nimic de la Atmel de pe site.M-am consultat cu niste amici si ziceau ca trebuie sa intru la Atmel pe site si sa iau de acolo niste chestii pentru AVRStudio 4, pentru a merge bine.Trebuia sa iau aceste header file.M-am tot uitat pe acolo si n-am vazut asa ceva.Tu ce parere ai despre acest lucru ?Trebuie sa-ti spun ca programele mele cam asa aratau, sinistru cum ai zis, fara aceste chestiuni de inceput.

Share this post


Link to post
Share on other sites
Guest stefan_v

S-a intamplat o chestie pe care n-o inteleg.Am scris toate acele lucruri, exact la inceputul programului, cum ai zis.Apar 3 erori si nu ma mai lasa in modul debugger.Si spune:1)-Cannot find include file:macro.asm2)-Cannot find include file:map.asm3)-Cannot find include file:init.asmMa lasa sa scriu doar :.include"m8def.inc".cseg.orgstar:.org OVF0addrinit:Zi-mi tu care-i chestia ca eu sunt depasit de problema.

Share this post


Link to post
Share on other sites
Guest stefan_v

M-am prins cum este cu "Call", cu initializarea stivei la Atmega8.Alta metoda mai simpla nu exista ? Mereu, inainte de" Rcall", trebuie sa scriu inca 4 instructiuni de initializarea stivei ?Cred ca este o chestie cam neplacuta.Ca sa apelez o subrutina trebuie 4 instructiuni de initializarea stivei plus instructiunea Rcall. Toate dureaza 7-8 cicli.Cred ca este cam mult pentru o chestie asa de simpla, dureaza foarte mult daca ne raportam la alte instructiuni.Poate mai aveti voi vreo idee...eu unul sunt incepator.

Share this post


Link to post
Share on other sites
Guest DragosP

M-am prins cum este cu "Call", cu initializarea stivei la Atmega8.Alta metoda mai simpla nu exista ? Mereu, inainte de" Rcall", trebuie sa scriu inca 4 instructiuni de initializarea stivei ?

Păi nu te-ai prins.. Cum adică mereu? O singură dată, la începutul programului, în zona de iniţializare hardware.

Cred ca este o chestie cam neplacuta.Ca sa apelez o subrutina trebuie 4 instructiuni de initializarea stivei plus instructiunea Rcall. Toate dureaza 7-8 cicli.Cred ca este cam mult pentru o chestie asa de simpla, dureaza foarte mult daca ne raportam la alte instructiuni.Poate mai aveti voi vreo idee...eu unul sunt incepator.

Nu e mult deloc. Caută şi tu pe net exemple simple de programe şi uită-te acolo cum se face, sau, şi mai bine, încearcă un HLL (c, pascal etc).

Share this post


Link to post
Share on other sites

Pai daca intializezi StackPointer- de fiecare data - fenomenul va fi ca intr-o subrutina din care faci un alt RCALL,la revenire MC-ul v-a sari din nou in zero. Ceea ce ai spus (init SP de fiecare data la RCALL) , nu permite decat un singur nivel de salt. La al doilea va fi ca si cum stiva nu este initializata. Dupa cum am mai spus ( si DargosP) SP-ul se initializeaza in prima faza. Restul nu mai este treaba ta, decat sa nu intri cu date in zona de RAM unde lucreaza SP-ul

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.