PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Attiny12 und Variablen



Furtion
17.02.2006, 20:52
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?

x-ryder
17.02.2006, 21:56
eram iss eh schlecht, du solltest die register verwenden...

Martin

Furtion
17.02.2006, 22:20
Und wie progt man die register?
ich habe davon 0 ahnung

x-ryder
17.02.2006, 22:24
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

ACsenf
18.02.2006, 19:44
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

x-ryder
19.02.2006, 10:50
@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.

ACsenf
19.02.2006, 12:38
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.

x-ryder
19.02.2006, 12:56
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

izaseba
19.02.2006, 13:22
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

x-ryder
19.02.2006, 13:23
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

izaseba
19.02.2006, 13:46
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

ACsenf
27.02.2006, 12:02
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 .

ACsenf
27.02.2006, 19:35
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.