PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : BASCOM Timer1: error 46: assignment error



Heiner Schmitz
14.09.2004, 15:59
Hallo zusammen,
das ist möglicherweise eine Anfängerfrage, ich kann aber leider selbst
keine Lösung finden.
Hier als erstes das Problem-Programm aus einem BASCOM-Beispiel, daß ich
auf das nötigste gekürzt habe:

'################################################# #############
' Dieses Demo läßtz eine LED in dem von ihnen gewählten
' Timer-Rhytmus blinken
'################################################# #############

$regfile = "m16def.dat"
'$regfile = "at26def.dat"
$crystal = 8000000

'Hier wird der Timer und der Teiler festgelegt
Config Timer1 = Timer , Prescale = 64

Config Pina.2 = Output 'dritte LED auf als Ausgang programmiert
Led3 Alias Porta.2

On Timer1 Timer_irq

Const Timervorgabe = 49911 'Einstellung für ca. 1 Sekunde

Enable Timer1
Enable Interrupts

Do
'Hier könnte Ihr Hauptprogramm stehen
Loop

Timer_irq:
Timer1 = Timervorgabe
Toggle Led3
Return
'################################################# #############

nun das Problem: Wenn ich
$regfile = "m16def.dat"
ersetze durch:
$regfile = "at26def.dat"
,was meinem Controller entsprechen soll, dann erhalte ich beim Syntax-Check in der Zeile:
Timer1 = Timervorgabe
den Fehler: error 46: assignment error (Timer1: 0 49911: 112)
?????????????????????????????????????????????????? ???????????
Der Fehler tritt nicht auf, wenn ich das Regfile für den
Tiny26 nehme und Timer1 durch Timer0 ersetze. Was ist beim Tiny26
und timer1 anders als bei anderen Controllern oder mache ich etwas
grundsätzliches falsch?
Danke für Eure Hilfe,
Heiner

14.09.2004, 16:46
Kann zwar kein Basic aber ist bei dem Ding überhaupt ein 16 Bit Timer eingebaut? Sonst wäre es logisch, dass das Schreiben von 49911 auf ein Byte unmöglich ist.

14.09.2004, 16:50
Und ich hasse diesselben Postings in zig Foren ...
http://www.mikrocontroller.net/forum/read-1-112590.html#new

14.09.2004, 17:10
na gut, die Sache mit dem 16Bit-Timer ist erledigt. Kann es vielleicht sein, daß ich Bascom erst einmal beibringen muß, daß es sich bei Timer1 um einen 8-Bit-Timer handelt? Denn auch wenn ich einen 8-Bit-Wert lade, ist immer noch das gleiche Prob vorhanden. Normalerweise sollte das doch in der def.dat definiert sein oder?
Hallo "Gast", kann ich was dafür, daß Du in allen möglichen Foren rumtobst?

14.09.2004, 17:19
Was hast du denn für einen Controller? at26def.dat sagt mir nix

recycle
14.09.2004, 17:26
Und ich hasse diesselben Postings in zig Foren ...
http://www.mikrocontroller.net/forum/read-1-112590.html#new


Und warum? Ist doch dein persönliches Problem, wenn du in mehreren Foren mitliest.
Ich habe nicht die Zeit regelmässig zig Foren zu lesen und zu vergleichen und bin deswegen froh, wenn möglichst viele Fragen hier gestellt und beantwortet werden.
Könnte mir vorstellen, dass es einige Leute auf mikrocontroller.net ähnlich sehen.

Davon mal abgesehen kann es eigentlich nie Schaden sich zu einer Frage oder einem Problem möglichst viele verschiedenen Meinungen einzuholen - im Prinzip machst du das ja wohl selber, wenn du verschiedene Foren parallel liest.
Wenn du zwei Zeitungen liest oder zwei unterschiedliche Nachrichtensendungen ansiehst, wärs wohl auch etwas viel verlangt, dass die sich untereinander absprechen und dir keine Doubletten zumuten.

14.09.2004, 18:13
es handelt sich um einen Atmel Tiny26. Kann es vielleicht sein, daß ich bei diesem Tiny ein anderes Register setzen muß um Timer1 voreinzustellen? Ich hab mich schon im Manual schummrig gelesen. Auch kannn ich zum Tiny26 leider keine Programmbeispiele finden, die mir zeigen können wie es richtig gemacht wird...

14.09.2004, 18:25
Ich denke der Tiny26 hat vermutlich keinen 16 Bit Timer. Somit kannst du den Source so nicht verwenden. So wie es aussieht hast du das Programm mit dem Tool RN-AVR generiert. Wähle da mal 8 Bit Timer und generiere Code neu, dann sollte es auch auf Controllern ohne 16 Bit Timern gehen.

15.09.2004, 10:16
Der Mega16 besitzt einen 16 Bit Timer!
Nach Deinen Konstanten und meinen Berechnungen zu urteilen wird der Interrupt aber alle 0,12 Sekunden ausgelöst.
Probiers mal mit:
"Prescale = 256"
und
"Timer1 = 34285" (als ersten Befehl in die Interruptroutine schreiben!!!)


..der Tiny26 hat..keinen 16 Bit Timer

Jepp! Er hat zwar zwei aber (leider) nur mit je 8 Bit.

Heiner Schmitz
15.09.2004, 14:58
Nach Deinen Konstanten und meinen Berechnungen zu urteilen wird der Interrupt aber alle 0,12 Sekunden ausgelöst.

stimmt, so hatte ich das beabsichtigt, genauer gesagt sollten es 0,125 Sekunden sein und damit gleichzeitig der kürzeste Interrupt-Zyklus um den Programmablauf möglichst wenig aufzuhalten.


"Prescale = 256"
und
"Timer1 = 34285"

Hab ich getestet, bringt leider auch keinen Erfolg. Ich denke fast Timer1 funktioniert nur im Zusammenhang mit 16-Bit-Timern. Also werde ich wohl mit 8 Bit leben müssen (0,033 Sekunden). Kann es sein, dass TCNT1 das Register ist über daß ich 8-Bit-Timer1 auslesen und einstellen kann?
Damit Danke an alle, die sich sehr bemüht haben, vielleicht bin ich auch irgendwann mal so weit hier helfen zu können.

16.09.2004, 19:37
Nimms mir nicht übel aber ich glaube, daß Du nur einen Blick ins Datenblatt werfen müsstest um Deinem Problem auf den Leim zu gehen. ;)
Der Mega8 hat 3 Timer. Zwei mit 8 und einen mit 16 Bit - Probiers mal mit Config Timer2 und Timer2 = "schlagmichtot".
Die dritte Variante rauszufinden welche Timer es gibt steckt versteckt im Simulator von Bascom.
Wenn Du Dir die Interupts anschaust, sollte beim Mega8 das OVF0, OVF1 und OVF2 - Flag sichtbar sein (OVF = timerOVerFlowflag).
Ob man eines davon auch per Hand setzen kann hängt vom Programm ab das Simuliert werden soll.
Also: Augen geschärft und genau hingeschaut!
Passiert mir auch ständig, das ich was Teste aber erstmal nix passiert weil ich nich richtig gelesen habe.

HeinerDE
24.09.2004, 10:03
Also, zum Schluss noch einmal für alle, beim Tiny26 ist unter BASCOM alles etwas anders als bei anderen Controllern:

Zum Setzen des Vorteiler für Timer1 nicht prescale verwenden (einfach weglassen), sondern in einer neuen Zeile: TCCR1B=n , wobei n einen Wert zwischen 0 und 15 annnehmen kann, 0 bedeutet Timer1 anhalten, ein Wert zwischen 1 und 15 bewirkt eine Vorteilung zwischen 1 und 16384

Zum Auslesen und setzen von Timer1 nicht die Variable Timer1 verwenden, sondern TCNT1, wobei TCNT1 einen Wert zwischen 0 und 255 annehmen kann.

"On timer1..." funktioniert !

Gruß an alle und danke für die Hilfe
Heiner

magic33
26.02.2007, 10:09
@heiner könntest du mal einen funktionierenden code mit timer1

SO ICH HAB mal einen funzenden timer1 code generiert 2TAGE jetzt klapts

CTC1 bit muss noch gesetzt werden



'/////////////////////////////////////////////////////////
'/// BASCOM ISP PROGRAMMER TEST timer1 ///
'/// toggle portb.3
'/////////////////////////////////////////////////////////
$regfile = "AT26def.dat" ' used device
$crystal = 8000000

$hwstack = 32 ' default use 32

$swstack = 10 'default use 10 for

$framesize = 40 'default use 40 for

Config Portb = Output


Led Alias Portb.0


Tccr1a = 17 'toggle ocr1b in pwm mode
Tccr1b = 135 'clock PRESCALE 64 ctc1 an relod nach compare b/c

Ocr1b = 125 'vorlasen servo mitte
Ocr1c = 255 'compare zahl


Enable Interrupts

Do

Wait 2 '' ' ' ' ' ' ' ' ' '
Toggle Led
Ocr1b = 192 '0,5ms servo links

Wait 2
Toggle Led
Ocr1b = 63 '1,5ms servo rechts

Loop

End 'pulsbreite 2ms