Archiv verlassen und diese Seite im Standarddesign anzeigen : Attiny12 und Variablen
Hi,
Ich habe ein problem und zwar ich muss bei einem attiny12 einen wert
z.b. 1000 von 10000 abziehen. Nun habe ich geschrieben :
$regfile = "at12def.dat"
$crystal = 1000000
Dim I As Eram Integer
I = 10000
Do
I = I - 100
Loop
end
Und da meint er invaling datatype
ist das normal ?
was könne man dagegen tun?
eram iss eh schlecht, du solltest die register verwenden...
Martin
Und wie progt man die register?
ich habe davon 0 ahnung
geh mal in icq on, da kann ich dir das besser erklärn, iss etwas komplitzierter
Martin
AlexAtRobo
18.02.2006, 19:08
Wäre nett, wenn das funktioniernde umgeschriebene Programm dann hier veröffentlicht wird, dann haben alle etwas davon.
lg
Alex
Ja, da bin ich auch gespannt,ob es mit Bascom eine Lösung gibt....
wobei ich bezweifle, daß von Xryder tatsächlich etwas an Hilfe kommt.
Gruß
Sven
Torsten_G
18.02.2006, 19:45
Was ist denn daran so kompliziert und geheimnisvoll?
Lies Dir mal die Bascom-Hilfe zum Thema "Eram" durch. Du kannst diese Variablen nicht wie normale Variablen behandeln, z. B. in Berechnungen. Es sind nur direkte Zuweisungen erlaubt.
Also musst Du über Zwischenvariablen gehen.
Ich greife mal Dein Beispiel auf, Du solltest es so aber nicht einspielen:
$regfile = "at12def.dat"
$crystal = 1000000
Dim H As Integer
Dim I As Eram Integer
H = 10000
Do
H = H - 100
I=H
Loop
end
Das EEPRPOM hat nur eine begrenzte Anzahl Schreibzyklen (nominell 100.000) und Du schreibst bei jedem Programmdurchlauf hinein. Gut möglich, dass der Chip das nur ein paar Sekunden mitmacht...
EEPROM-Variablen schreibt man normalerweise nur in langsamen Zyklen oder innerhalb einer Setup-Routine, die nicht permanent durchlaufen wird.
Viele Grüße
Torsten
@senf: wasn mit dir los, ich muss bloß bis morgen meine facharbeit fertigmachen, daher antworte ich da nich ad-hoc...
@torsten: du hast das problem nicht ganz verstanden, er hatn attiny, die haben eben gar kein sram, also kannste h gar nicht deklarieren.
Hallo X-ryder,
wenn ich Deine Antwort lese, kann ich eigentlich nur sagen, Frage nicht verstanden. Du hast seinen Quellcode nochmals abgeschrieben mit kleinen Korrekturen, toll! Das diese kleinen Tinys kein Sram haben, dürfte wohl jeder wissen, der ein Datenblatt lesen kann.
Du hast aber so groß und breit erklärt man muss einfach die vorhandenen internen 32 Register als ram benutzen...kann man auch nachlesen.
Was uns aber alle hier interessiert ist wie man das unter Bascom anstellt. Du hast ja erklärt du weißt wie es geht, also wir warten. Wobei ich nicht glaube, daß es mit Bascom klappt, wenn man sich das def-File mal genau anschaut...
Gruß
Sven
P.s. Viel Erfolg bei Deiner Facharbeit.
senf, ich bin dir echt dankbar, das du beiträge damit reinbekommst, das du andere versuchst fertigzumachen, ich hab dir das in deinem anderen post schon geschrieben, brauche das also hier nicht mehr zu tun.
mein wissen zu dem thema ist, das man es mit bascom hinbekommt, man muss bloß mindestens die hälfte aller befehle in assembler mnemonics schreiben, da die meisten methoden in bascom eigene variablen im sram anlegen wollen, das kann man allerdings in der hilfe nachlesen, welche methode sowas macht, und wie die variablen heißen.
nun ist es so, das ich kein assembler kann, und auch nicht die zeit habe, das ganze jetzt nachzuschlagen, also schlage ich vor, senfi schlägt das ganze mal nach, der hat ja auch genug zeit rumzumeckern.
eins weiß ich auf jeden fall, einen wert in ein register legen tut man mit "ldi", die syntax dazu lautet:
ldi Rxx, wert
dabei ist xx eine zahl zwischen 0 und 31 und das ganze mit führenden nullen, also auch 01 oder so. wert kann dabei ein byte groß werden, mehr ist nicht möglich.
wie man ein register ausliest ist eine andere sache, denn man muss den genauen anwendungszweck wissen, man braucht ja solang kein register auslesen, wie man es nicht irgendwo ausgeben will, dafür gibt es auch keine direkte methode (ja, ich weiß, iss unverständlich, einfach mehrmals lesen, wenn senfi dazu stellung nehmen will, meinetwegen...)
man kann auch mit den variablen rechnen, das müsste dann mit add wert, wert oder sowas gehen, aber das will uns unser lieber senfi ja presentieren...
ach ja, senfi, nochwas: manche leute können einfach nicht so gut englisch wie du und ich, die können nicht einfach mal ein datenblatt durchlesen. genauso schaut sich nicht jeder die defdatfiles an.
mal sehen, ob ac immer noch einen gruß sendet.
Martin
dabei ist xx eine zahl zwischen 0 und 31
Das ist nur zur Hälfte richtig.
Register R0 - R15 kann man nicht mit dem Befehl ldi beschreiben...
Gruß Sebastian
das ist gut, ich hatte mir schon sowas gedacht, weil ich auch weiß, das verschiedene register vom atmel selbst zur berechnung dienen, aber ich wusste nicht ganz welche, danke.
Martin
Zur Berechnung kann man sie alle verwenden, es gibt schon ein Paar "Sonderregister", aber um Werte abzuspeichern kann man alle Benutzen, nur beim Beschreiben muß man aufpassen:
ldi R16,0xFF geht
ldi R2,0xFF geht nicht, da muß man schon einen Umweg machen:
ldi R16,0xFF
mov R2,R16
daraus zu lesen ist wiederrum egal:
out PORTD,R2
out PORTD,R16
beides geht...
Naja, wenn jemand mehr wissen möchte kann ich nur auf diese (http://www.avr-asm-tutorial.net/avr_de/beginner/index.html) Seite verweisen.
Gruß Sebastian
AlexAtRobo
19.02.2006, 20:19
Der Tiny12 hat keinen SRam, nur die Register.
als in Assembler kann man das lösen, in dem man jeweils 2 Register pro zahl verwendet.
ldi R16, 0x27
ldi R17, 0x10 ; 0x2710 = 10000
ldi r18, 0x03
ldi r19, 0xe8 ; 0x03e8 = 1000
nun die subtrakion
zuerst die unteren Bytes subrtahieren
sub r17, r19 ; Wenn R19 > R17 wird das Carry Flag gesetzt, sonst nicht
dann
subc r16, r18 ; Jetzt mit carry subtrahieren
In r16, r17 steht nun das Ergebnis
Ich kann mir kaum vorstellen, das man das in Bascom anders lösen kann, wenn man keine SRAM hat. Ich denke, bei den Ramlosen typen wird man nicht um Assembler rumkommen.
lg
Alex
svenulm31
21.02.2006, 17:51
hi leute ich hab mal vor längerer zeit ne kaffemaschine mit nem tiny bestückt (orginal ic hat sich in Rauch aufgelöst) vieleicht hilft das weiter
'$regfile = "AT12def.dat"
'$tiny
'portb.0 Relais ,,Pinb.1 ON/OFF ..Pinb.2 3 Tassen ,, Portb.3 LED1 ,, Portb.4 LED 2
Enable Interrupts
Enable Int0 'enable the interrupt
On Int0 Stopall Nosave 'jump to label2 on INT0
Dim A As Iram Word
Dim B As Iram Word
$asm
ldi R16,&h07
Out Ddrb , R16 '3 Ausgänge
LDI R16 ,&h18
Out Portb , R16 'Pullup´s setzen
$end Asm
Start:
Do
If Pinb.1 = 1 Then Gosub Onof 'Taste 0/1
If Pinb.4 = 1 Then Gosub Dreibis 'Taste 3-5 Kaffe
Loop
End
Onof:
Set Portb.2
Wait 120
Reset Portb.2
Return
Dreibis:
Set Portb.2
Wait 120
Reset Portb.2
Return
Stopall:
Portb = 0 'reset
Return
Tagtimer: '720 s sind 12 Stunden
Return
Sicher dass das so auf der Hardware läuft?
Im Simulator tut es, allerdings hängt sich sich der Tiny 12 auf sobald man Wait benutzt, Waitms funktioniert. Ansonsten ist halt wie oben gezeigt Assembler angesagt.
Gruß
Sven
svenulm31
27.02.2006, 17:55
die Kaffemaschiene läuft jetzt schon 2 jahre damit also hab damit anscheinend nichts grundlegendes falsch gemacht denk ich mal
nochmal sven
svenulm31
27.02.2006, 18:29
Achso zu Wait's,Ich wollte nur zeigen wie das mit dem iram und dem Einbinden von Assembler funktioniert. Im kompletten Programm hab dann noch den Timer vergewaltigt .
Hi nochmal!
Hey, das ist ja klasse, daß es so funktioniert. Also du hast kein Wait verwendet. Hast du den Timer dann auch in Assembler geprogt? Mit Bascom klappt das bei den kleinen Tinys nicht so recht. Jedenfalls habe ich es noch nicht hinbekommen, wenn ich da den Timer so konfiguriere, wie ansonsten gewohnt tut sich anschließend auf dem Tiny nix mehr :(.
Gruß
Sven
svenulm31
27.02.2006, 20:36
Ich hab jetzt leider kein tiniy12 mehr da um es zu testen
Hilfreich ist auf alle fälle beide Simulatoren zu verwenden.(Bascom und Studio4 unterscheiden sich in eigen sachen)
Ich hab grad mal die den timer gestarte, in Studio4 funzt er bestens.
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.