hallo, ich habe vor kurzem mein atmega16-board bekommen, und auch schon das tutorial hier durchgemacht. grundsätzlich würde ich ja die einzelnen schritte verstehen, wenn ich sie aber dann selbst programmieren will, stoße ich immer noch auf manche probleme. ich würde gerne einen einfachen zähler für meine 7-segment-anzeige bauen, der einfach nur mal von 0-9 an der stelle DIGIT0 zählt. ich habe mir das so überlegt, dass ich einfach einen timer hernehme, diesen überlaufen lasse, und jedesmal, wenn ein überlauf passiert ist, ich die anzeige der DIGIT0 um eine ziffer erhöhe (der nächste schritte wäre dann wohl, bei einem tastendruck den zähler rückwärts laufen zu lassen). gleich mal vorweg: kann man das so machen? würde sich das mit den (verzögerungs-)zeiten ausgehen? oder ist das völliger quatsch, den ich mir hier überlegt habe? da ich noch sehr unsicher bei dem ganzen bin, würde ich mich über ein paar tipps sehr freuen! dann hätte ich noch eine zweite frage: wenn ich über meine knoppix-cd (also auf einer virtuellen linux version) das µC-board programmieren will, funktioniert alles ohne probleme. ich würde jedoch auch gerne das AVR Studio 4 in Windows XP benutzen, jedoch habe ich irgendwie keine treiber für mein board. ich kann es also über USB anschließen, und mein PC erkennt es auch, jedoch kann ich keine treiber dafür installieren und wenn ich im AVR Studio über "Tools" -> "Programm AVR" -> "Connect" etc. auf mein Board zugreifen möchte, funktioniert das nicht. gibt es irgendwo vielleicht windows-treiber für das atmega16-board? googeln hat mir bis jetzt nicht geholfen. vielen dank für eure hilfe/tipps!
1 - ja 2 - mein atmega16-board bekommen - schön für dich - welches ?
es ist ein atmega16 16pu. ich habe das mit dem timer-overflow-interrupt schonmal beim ansteuern der leds ausprobiert, und den prescaler auf 1024 gestellt. sie blinken auch für ca. 1-2 sekunden, danach hören sie aber auf zu blinken und leuchten nur mehr, wobei sie den zustand ja eigentlich nicht verlassen sollten (wegen d. endlossschleife), oder? kann ich den timer-overflow eigentlich auch länger - sagen wir 1-2 sekunden - einstellen? wenn ja, wie? sodass also alle 2 sekunden eine andere ziffer am led erscheint. vielen dank!
Prinzipiell kannst du alles programmieren was du möchtest, selbst wenn man dafür nachher keine Verwendung hat. Unsinnig gibt es nicht. Versuche doch einfach die verschiedenen Tutrials miteinander zu kombinieren. In deinem Fall kannst du das Tutorial mit dem Timer und das Tutorial über den Speicher miteinander kombinieren. Die Segmantanzeige hängst du einfach an einen der Ports des AVRs. Das Programm kannst du dann beliebig ausbauen, da sind deiner Phantasie dann keine Grenzen gesetzt.
> grundsätzlich würde ich ja die einzelnen schritte verstehen, wenn ich > sie aber dann selbst programmieren will, stoße ich immer noch auf > manche probleme. Das ist ganz normal am Anfang. Allerdings hängt es vielleicht auch mit deiner fehlenden Shift-Taste zusammen. > gleich mal vorweg: kann man das so machen? Ja, kann man. > würde sich das mit den (verzögerungs-)zeiten ausgehen? Wenn's dir zu schnell geht, kannst du ja noch eine Schleife einbauen, so daß nicht bei jedem Überlauf der Zähler inkrementiert wird, sondern nur nach einer bestimmten Zahl von Überläufen. Aber mit einem passend eingestellen Presacler sollte es eigentlich reichen. Wenn du den 16-Bit-Timer voll durchrennen läßt und den Prescaler auf 1024 stellst, bekommst du alle 1024*65536 = 67108864 Taktzyklen einen Überlauf. Bei 16 Mhz Takt wären das ca. 4,2 Sekunden.
Und wenns mal klemmt, poste einfach deinen Code mit. Soweit ich weiß gibt es einen 16Bit Counter, abhängig von deinem MC-Takt erzeugt der einen Überlauf. Um die Zeit für einen Überlauf zu verkürzen kannst du das Vergleichsregister mit einem Wert laden.
1 | ;Timer einstellen |
2 | ldi temp,HIGH(TIMERWERT) |
3 | out OCR1AH,temp ; Vergleichsregister (LowByte) mit Var Timerwert laden |
4 | ldi temp,LOW(TIMERWERT) |
5 | out OCR1AL,temp ; Vergleichsregister (HighByte) mit Var Timerwert laden |
6 | |
7 | ldi temp,(1<<CS12)|(1<<WGM12) ; Prescaler Systemtakt durch 256 teilen |
8 | out TCCR1B,temp ; und Timer im CTC-Modus, siehe Tabelle S.99 |
9 | |
10 | ldi temp,(1<<OCIE1A) ; Interrupt für CTC Modus freigeben |
11 | out TIMSK,temp |
den Timer betreibst du im CTC Modus, schau dir einfach das Datenblatt zu deinem AVR an. Fragen beantwortet?
vielen dank für die antworten. ein paar fragen hätte ich noch: damit ich die einzelnen ziffern ausgeben kann, sollte ja nach jedem timer-overflow eine neue ziffer ausgewählt werden, d.h. ich sollte die einzelnen bitmuster irgendwo abspeichern. wie macht man das am besten? im tuturial wurde es mit ".db" gemacht, das scheint aber mein assembler nicht zu kennen. gibt es da noch eine andere möglichkeit? und soll man die ausgabe-schleife gleich in der interrupt-routine programmieren? > Wenn's dir zu schnell geht, kannst du ja noch eine Schleife einbauen, so > daß nicht bei jedem Überlauf der Zähler inkrementiert wird, sondern nur > nach einer bestimmten Zahl von Überläufen. wie meinst du das, wo genau soll ich diese schleife einbauen? dankeschön!
Schau doch erst mal ob du mit dem 16Bit Timer klarkommst. Mit zusätzlichen Schleifen würde ich erst mal nix machen. Wie Rolf dir vorgerechnet hat bekommst du alle 4,2 sekunden eine neue Zahl, das sollte erst mal reichen. Hast du das speicher-tutorial mal durchgearbeitet? Den db. Befehl kennt dein AVRStudio mit Sicherheit.
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.