Forum: Mikrocontroller und Digitale Elektronik AVR Assembler - Ein paar Anfänger Fragen


von Henry J. (indy85)


Lesenswert?

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!

von Düsentrieb (Gast)


Lesenswert?

1 - ja
2 - mein atmega16-board bekommen  - schön für dich - welches ?

von Henry J. (indy85)


Lesenswert?

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!

von pacer (Gast)


Lesenswert?

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.

von Rolf Magnus (Gast)


Lesenswert?

> 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.

von pacer (Gast)


Lesenswert?

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?

von Henry J. (indy85)


Lesenswert?

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!

von pacer (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.