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
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.
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!
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.
Dein Problem liegt an einem kleinem Wörtchen, über das du dich gründlich informieren solltest, denn du wirst es noch öfter brauchen: volatile
>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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.