Forum: Mikrocontroller und Digitale Elektronik Probleme mit Atmega162 und Timer0


von Horaz (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich versuche mich seit kurzem mit Mikrocontrolern und mit ein paar 
Codeschnipseln, die ich mir im Internet gesucht habe und der Hilfe eines 
Kommilitionen hab ich schon das ein oder andere Projekt realisiert.

Bei diesem scheitere ich allerdings und ich hoffe, dass ihr mir erklären 
könnt warum;)
Ziel des Programms ist es, dass ich eine 8 bit Adresse am Port C 
einlese, 6 addiere auf den Port B ausgebe und nochmal 6 und das dann auf 
den Port D ausgebe.
Benutze einen atmega162

Anfangs habe ich das über einen Pin Change versucht, was dazu führte, 
dass die Simulation wunderbar war, nur der Chip hat sich ein wenig 
gewehrt(am Chip selber liegt es nicht, sonst hätten 3 den gleichen 
Fehler).

Nach einigem hin und her und verschiedenen Hinweisen im Internet wollte 
ich es nun einfacher machen und einfach mit einem Timer overflow nach 
einer bestimmten Zeit die Werte festsetzen(im Anhang). In der Praxis tut 
er so und so was er will, aber in der Simulation verstehe ich z.b. nicht 
warum er meine Interrupt-Routine völlig ignoriert, obwohl T0V0 gesetzt 
ist und der Overflow einsetzten müsste.
Dafür startet er die Funktion main allerdings neu, was für mich auch 
keinen Sinn ergibt.
Ganz abgesehen davon ist es dem Programm völlig egal was ich an den Pin 
C anlege... "adr" bleibt bei mir immer auf 0.
Wäre für ein paar Erklärungen dankbar

von spess53 (Gast)


Lesenswert?

Hi

JTAG abgeschaltet?

MfG Spess

von Horaz (Gast)


Lesenswert?

Hallo Spess

hab das heute morgen gleich mal ausprobiert, leider nur mit mäßigem 
Erfolg.
Das Programm reagiert immernoch nicht auf den Timer overflow.
Hab aus Spaß nochmal kurz den Pin Change eingebaut und die 
entsprechenden Register gesetzt. In dem Fall macht er immerhin schonmal 
etwas sinnvolleres, aber noch nicht das was er soll. Der Teil-Erfolg 
kam, als ich deinen Rat befolgt habe und ich plötzlich alle Pins von 
Port C ansprechen kann und ich mich bei einem früheren Projekt schon 
darüber geärgert habe:)
Davor hat er auf keine Eingabe von PortC 6 &7 reagiert.

von Justus S. (jussa)


Lesenswert?

Horaz schrieb:
> Das Programm reagiert immernoch nicht auf den Timer overflow.

vielleicht sollest du dir mal den generierten Assembler-Code anschauen, 
ob deine IF-Abfrage überhaupt noch drinnen ist...eigentlich müsste sie 
der Compiler rauswerfen, weil flag nie geändert wird...

und sowas
1
TIMSK = 0x01;
2
TCCR0 = 0x01;
macht man nicht!

von Horaz (Gast)


Lesenswert?

Hallo jussa

Vielen Dank für die Hinweise, aber ich komme damit nicht wirklich 
weiter.
Zum einen finde ich keine Datei, die mir den Code in Assembler 
anzeigt(muss ich die extra generieren?) und zum anderen kenne ich mich 
in Assembler nicht besonders gut aus. Würde mich daher freuen, wenn du 
mir einen Hinweis geben könntest worauf ich achten muss.

Justus Skorps schrieb:
> und sowasTIMSK = 0x01;
> TCCR0 = 0x01;
> macht man nicht!

Finde ich an sich durchaus nett, weil ich versuche meinen Code 
verständlich zu schreiben, aber ohne einen Verbesserungsvorschlag kann 
ich nichts damit anfangen.


Unabhängig davon habe ich das Problem inzwischen gelöst:
Ich benutze den Pin Interrupt, welcher dank spess inzwischen vollständig 
funktioniert und durch eine Rechnung in der while-Schleife, die für mich 
keinen Sinn ergibt tut das Programm nun auch das was ich will.
1
if(flag ==1)
2
  {
3
  flag=0;
4
  adr=PINC;
5
  PORTA = adr;
6
  PORTB = adr-6;
7
  PORTD = adr-12; 
8
  }
Vermute, dass das ein Problem mit der Abfrage nach den Pins 
zusammenhängt, welche anscheinend nicht unabhängig von den Pull ups 
sind. Daher wird das ganze im Simulator anders verarbeitet als auf der 
realen Hardware
Kann das so stimmen oder gibt es andere Gründe?

Was es mit dem Timer auf sich hat würde mich dennoch interessieren, da 
ich wohl früher oder später wieder damit in Kontakt kommen werde.

von Stefan E. (sternst)


Lesenswert?

Dein Problem liegt an einem kleinem Wörtchen, über das du dich gründlich 
informieren solltest, denn du wirst es noch öfter brauchen: volatile

von Hannes E. (k1ngarthur) Benutzerseite


Lesenswert?

>Finde ich an sich durchaus nett, weil ich versuche meinen Code
>verständlich zu schreiben, aber ohne einen Verbesserungsvorschlag kann
>ich nichts damit anfangen.
Schau dir mal das AVR-GCC-Tutorial an. Dort findest du entsprechenden 
Code, wie du einzelne Bits eines Registers ändern kannst.
Immer das ganze Register zu beschreiben kann dazu führen, dass du andere 
Einstellungen aktivierst oder ggf. im Laufe deines Programms wieder 
deaktivierst.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.