PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Anfänger kommt mit Atmel328 nicht klar



ulli328
06.11.2011, 06:42
Hi,
habe mir ein BabyOrangutan B-328 zwecks Motoransteuerung zugelegt und mache erste Schritte mit Assembler und AVR-Studio4,
Programmer MK2 auch gleich mitgekauft.
Bis zum eigentlichen Zweck - Motorsteuerung - bin ich noch garnicht vorgedrungen, bin zur Zeit noch fasziniert von all den Möglickeiten,
die der 328 bietet. Habe etwas mit Zeitschleifen gespielt, "Hello World" mittels eines Blinkprogramms vollzogen und übe jetzt mit Timern und
Interrupts. Hier nun mein Problem: Timer0 läuft mit Simulator und F11, Compare OCR0 ist mit einem Wert geladen aber sobald ich TIMSK0
aufrufe kommt bei "Build" die Meldung "out of range" und nichts geht mehr, wenn ich aber OCIE im Simulator manuell setze, läuft die Chose
und eine ISR wird ordnungsgemäß ausgeführt, im Programm kann ich aber weder TIMSK noch OCIE setzen.
Wahrscheinlich läßt sich dies wortreich geschilderte Problem mit enem "Kick" lösen, leider ist mir eine Erleuchtung bisher verschlossen
geblieben.
Hat jemand meine konfusen Gedanken verstanden und weiß, was ich mache, vergessen habe oder falsch mache? Dann bitte die Lösung
verraten.

vielen Dank im voraus
ulli

markusj
06.11.2011, 20:36
Vermutlich ist eine andere Berechnung "out of range", kannst du Mal die vollständige Build-Ausgabe zusammen mit deinem Code hier zeigen?

mfG
Markus

ulli328
07.11.2011, 17:27
;Hier der Code mit "Build"-Ergebnis, out of range bezieht sich aber doch eindeutig
;auf TIMSK0 - oder nicht??
;Gruß
;Ulli

.include"m328Pdef.inc"

;Übungen mit Timer und Interrupts
.def temp = r16


.org 0x0000
rjmp main ; Reset Handler
.org 0x0020
rjmp timer0_overflow ; Timer Overflow Handler

ldi temp,0x01
; out TIMSK0, temp
main:
ldi temp, HIGH(RAMEND) ;Stack initialisieren
out SPH, temp
ldi temp, LOW(RAMEND)
out SPL, temp

ldi temp,0xC1 ;clock wählen
out TCCR0B, temp

ldi temp, 0x20 ;beliebigen Wert in Timer0
out TCNT0, temp

; ldi temp,0x3B ;für Compare Match,
; out OCR0B, temp ;geht aber auch nicht, nur wenn TOIE manuell
;im Simulator gesetzt wird, krieg es aber im
;Programm nicht hin: TIMSK0 out of range
ldi temp,0x01
out TIMSK0,temp ;kann auch hier stehen, ist egal
sei

loop:
rjmp loop

timer0_overflow:
sbi portD,4 ;der Overflow Handler.
reti ;geht auch nicht mit Timer0 Comp (addr. 0x001E)
Copyright (C) 1995-2009 ATMEL Corporation

C:\Dokumente und Einstellungen\Besitzer\Desktop\Programme\timer3.as m(1): Including file 'C:\Programme\Atmel\AVR Tools\AvrAssembler2\Appnotes\m328Pdef.inc'
C:\Dokumente und Einstellungen\Besitzer\Desktop\Programme\timer3.as m(31): error: Operand 1 out of range: 0x6e

Assembly failed, 1 errors, 0 warnings

robin
07.11.2011, 17:51
ersetz das out mal durch sts

dir sagt ja schon die fehlermeldung an was es liegt. "out of range" mit dem OUT befehl kannst du nur die ersten 32(?) I/O Register ansteuern. Zahl weiß ich grad nicht ganz genau, steht aber in der hilfe irgendwo erklärt. Was du auf jeden Fall suchst ist der STS Befehl.

ulli328
07.11.2011, 19:13
Danke, das war es. muß den Schritt nochmal nachvollziehen, wär nicht drauf gekommen.
Ist das nur bei (oder ab) 328 so?

Gruß
Ulli

robin
07.11.2011, 21:20
Kann dir nur sagen, das es auch beim kleineren 168er so is, mit mehr hab ich auch noch nicht richtig "spielen" können.

oberallgeier
07.11.2011, 22:07
ersetz das out mal durch sts .. mit dem OUT befehl kannst du nur die ersten 32(?) I/O Register ansteuern ...
... das war es ... wär nicht drauf gekommen. Ist das nur bei (oder ab) 328 so ...@ulli328 - vermutlich gehörst Du zu den Abenteurern und Glücksrittern, die ohne Datenblatt arbeiten. Im 8271C–AVR–08/10 steht auf Seite 537 im Instruction Set Summary: OUT ... Out Port und STS ... Store Direct to SRAM. Und obs nur beim 328er ist ? Guck mal die anderen Datenblätter nach, dann weißt Du es. Oder mal überlegen . . . .