mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Probleme mit Atmega162 und Timer0


Autor: Horaz (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

JTAG abgeschaltet?

MfG Spess

Autor: Horaz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Justus Skorps (jussa)
Datum:

Bewertung
0 lesenswert
nicht 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
TIMSK = 0x01;
TCCR0 = 0x01;
macht man nicht!

Autor: Horaz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
if(flag ==1)
  {
  flag=0;
  adr=PINC;
  PORTA = adr;
  PORTB = adr-6;
  PORTD = adr-12; 
  }
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.

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hannes E. (k1ngarthur) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.