Forum: Mikrocontroller und Digitale Elektronik 24h Schalter mit Attiny 12


von Fred vom J. (andreasluebbers)


Lesenswert?

Möchte folg. realisieren:
Mit einem Attiny12 der über einen Transistor ein Relai ansteuert das wie 
folgt geschehen soll:
Spannung anlegen, Port B1 gibt für 10 sec High Pegel, dann 24h nix tun, 
dann Port B1 wieder für 10sec auf High Pegel. Hier mein Code in Bascom, 
leider geht das irgendwie nicht. So wie es aussieht bleibt der Prozess 
am Wait 86400 hängen. Kann das anders gelöst werden?

$regfile = "attiny12.dat"
$crystal = 1200000
Config Portb.1 = Output
$noramclear
$swstack = 0
$framesize = 0

Do
Portb.1 = 1      "Port B1 auf high Pegel"
Waitms 10000     "10sec warten"
Portb.1 = 0      "Port B1 wieder auf Low Pegel"
Wait 86400       "86400 sec (24 Stunden) warten"
Loop
End

Aber warum geht das so nicht ??? Änder ich die 86400 in waitms wird die 
Zahl nicht mehr angenommen.
Wer hat eine Idee?

von Falk B. (falk)


Lesenswert?

@  Andreas Lübbers (andreasluebbers)

>Aber warum geht das so nicht ??? Änder ich die 86400 in waitms wird die
>Zahl nicht mehr angenommen.

Wahrscheinlich weil der Parameter von Waitms auf 255 (8-Bit) oder 65536 
(16-Bit) begrenzt ist.

>Wer hat eine Idee?

Mit wait wird das sowieso nix. Du brauchst 1. einen Quarz am AVR, 
zweitens macht man das über einen Timer, wenn es halbwegs genau sein so.
Das geht auch in BASCOM.

MFG
Falk

von Fred vom J. (andreasluebbers)


Lesenswert?

Und wie würde dann ein einfacher Code aussehen? Kenn mich mit dieser 
Timer0 Timer1 Geschichte bisher nocht nicht so wirklich aus. Genau muss 
es wirklich nicht sein. Kann in 10 Tagen ruhig eine Abweichung von mehr 
als 10Minuten haben, kein Problem.
Allgemein der Befehl "wait" ist ohne Funktion, obwohl der Compiler nicht 
meckert!

von Fred vom J. (andreasluebbers)


Lesenswert?

Jemand ne schnelle und einfache Lösung? Außer ne Zeitschaltuhr vom 
Baumarkt !?

von Karl H. (kbuchegg)


Lesenswert?

Fred vom Jupiter schrieb:
> Und wie würde dann ein einfacher Code aussehen? Kenn mich mit dieser
> Timer0 Timer1 Geschichte bisher nocht nicht so wirklich aus.

Das kann man auch lernen

> Allgemein der Befehl "wait" ist ohne Funktion, obwohl der Compiler nicht
> meckert!

Glaub ich nicht.
Wartet denn
Wait 10
nicht ca. 10 Sekunden?


Hinweis: Anstelle von 60 Minuten, also 3600 Sekunden, kann man auch 10 
mal 360 Sekunden oder 100 mal 36 Sekunden oder 20 mal 180 Sekunden oder 
.... warten.
Der Unterschied: die Zahlen, die man Wait vorsetzt, sind kleiner und die 
FOR-Schleife ist schon erfunden.

von Fred vom J. (andreasluebbers)


Lesenswert?

Komischer Weise ist es aber so. Ich kann ja z.B. auch wait 1 für beide 
Zeiten eingeben und ich hätte ein Blinklicht, dem ist aber nicht so.
Woran kann das liegen?  Kann der Tiny12 keine Wait Befehle? Waitms geht 
tadellos.

von Karl H. (kbuchegg)


Lesenswert?

Fred vom Jupiter schrieb:
> Komischer Weise ist es aber so. Ich kann ja z.B. auch wait 1 für beide
> Zeiten eingeben und ich hätte ein Blinklicht, dem ist aber nicht so.

Interessant.

> Woran kann das liegen?  Kann der Tiny12 keine Wait Befehle?

Das macht sowieso nicht der Tiny so wie du dir das vorstellst.

> Waitms geht
> tadellos.

Na dann nimm halt das.

Wartet man 60 mal 1000 Millisekunden, hat man auch 1 Minute gewartet.
das wiederrum 60 mal -> man hat eine Stunde gewartet.
Und von da sollte der Schritt zu 24 Stunden nicht mehr schwer sein :-)

Wie gesagt: die FOR-Schleife ist schon erfunden. Deinem Tiny ist es 
egal, was er tun soll, und wenn es nur stupide ein paar Variable in ein 
paar ineinander geschachtelten Schleifen hochzählen ist.


Wenn das für dich programmtechnisch ein Problem darstellt, dann solltest 
du wirklich mit der Baumarkt-Lösung liebäugeln.

von Fred vom J. (andreasluebbers)


Lesenswert?

Die Schleife macht mir immer noch Probleme! Wenn nichts am TV läuft und 
jemand Lust hat, immer her mit dem Quellcode.

von snowfly (Gast)


Lesenswert?

for i=0 to 60
 for j=0 to 1000
 [...]
 next
next

von snowfly (Gast)


Lesenswert?

Mit Tiny12 und Bascom hab ich auch schonmal gebastelt....
und aufgegeben.

wegen dem fehlenden RAM funktioniert darauf so einiges nicht.
Tip: bestell dir nen anderen µC mit dem Tiny12 macht das keinen Spass.
also ATMega88 oder 48 und wenns ein 8Beiner sein muss dan halt Tiny45 
oder 25

von Falk B. (falk)


Lesenswert?

Hmm, so ein Mist.

"6.45 $TINY Action
Instruct the compiler to generate initialize code without setting up the 
stacks.

Syntax $TINY

Remarks
The tiny11 for example is a powerful chip. It only does not have SRAM. 
BASCOM
depends on SRAM for the hardware stack and software stack.
When you like to program in ASM you can use BASCOM with the $TINY 
directive.
Some BASCOM statements will also already work but the biggest part will 
not work.

A future version will support a subset of the BASCOM statements and 
function to be used with the chips without SRAM. Note that the generated 
code is not yet optimized for the tiny parts. Some used ASM statements 
for example will not work because the chip does not support it."

Ergo. Forget about it mit BASCOM.

von El Patron B. (bastihh)


Lesenswert?

Falk Brunner schrieb:

> Ergo. Forget about it mit BASCOM.


WITH lieber Falk, with nicht mit ;)

Immer diese verdenglischung ;)

von Charly B. (charly)


Lesenswert?

nimm dir ein tiny45 und mach einen quartz dran, denn der interne
osc. ist nicht wirklich genau.
programmier dir dann eine schleife von zb. 10 minuten und ruf
diese entsprechen oft auf.

das bekommst du schon hin, ist ein bisschen tüftelei aber absolut
kein problem mit bascom

und wenns hakt melde dich

vlg
Charly

von Falk B. (falk)


Angehängte Dateien:

Lesenswert?

Oder doch?

http://www.mitchsoft.de/Tips/BascomIDE/ATtiny_ohne_SRAM/Start.html

Siehe Anhang, etwas fummelig, sollte aber gehen. Zum Testen ist der 24h 
Stunden Zyklus verkürzt, für die echten 24h muss man das auskommentierte 
reinnehmen und den zeiten Block auskommentieren.

MfG
Falk

von Fred vom J. (andreasluebbers)


Lesenswert?

Ich denke du meinst den "zweiten Block"!!! Von 'Schnellstart bis End If`
Leider Startet das System nicht mit den 10sec. High-Pegel. Warum nicht 
??
Ist Attiny12 und Bascom wirklich so ein scheiß?

von Falk B. (falk)


Lesenswert?

Wahrscheinlich fehlt die Initialisierung

Cnt3 = 0

von Fred vom J. (andreasluebbers)


Lesenswert?

Danke für die Antwort, werde gleich mal testen ob dann alles soweit 
startet.

von Fred vom J. (andreasluebbers)


Lesenswert?

Der Prescaler von 1024 und 256 ist das überhaupt möglich? Habe Cnt03=0 
gesetzt, PortB.1 geht dann auch auf High Pegel. Aber länger als 
erwartet. Soweit im Datenblatt steht, geht der Prescaler doch nur bis 
max. 1024. oder sehe ich das falsch?
Dann noch eine Frage zum cnto1-cnt03. Im Datenblatt der Attiny12 heißt 
es cs00-cs02. Oder spielt das hier keine Rolle?

von Karl H. (kbuchegg)


Lesenswert?

$crystal = 1200000


Das wird nicht stimmen. Der Tiny wird nicht auf 1.2Mhz laufen.
Sieh dir im Datenblatt die OSCAL Einstellung an und dreh die mal auf 
(aus dem Gedächtnis) Maximum.

von MWS (Gast)


Lesenswert?

> Der Tiny wird nicht auf 1.2Mhz laufen.
Doch, Karl Heinz, tut er.

von Karl H. (kbuchegg)


Lesenswert?

MWS schrieb:
>> Der Tiny wird nicht auf 1.2Mhz laufen.
> Doch, Karl Heinz, tut er.

Bist du sicher?
Mein erster AVR war auch ein Tiny12. Wenn mich mein Gedächtnis nicht 
täuscht, machte der so um die 700 bis 800kHz. Erst nachdem ich den OSCAL 
hochgedreht hatte, kam ich auf über 1Mhz.
Ich rede nicht von den restlichen Fuses sondern nur vom OSCAL, die 
direkt an den RC-Oszillator geht.

von MWS (Gast)


Lesenswert?

> Bist du sicher?
Nur was das Datenblatt mir sagt, ich würde keine Abweichung um -42% 
erwarten, 10% vielleicht.

von Charly B. (charly)


Lesenswert?

wies beim tiny12 ist weis ich nicht genau,
aber die groesseren haben ein osccal byte
im chip ab werk gespeichert, das muss meines
wissens ausgelesen werden und ins oscal (oder so)
beim programmstart reingeschrieben werden
ohne das kann es schon sein das er wie Karl-Heinz
schreibt mit 700-800khz rennt
i verwende zb. mega8 mit oscal am anschlag rennen
die mit  ~14.5 Mhz (statt 8Mhz)

vlg
Charly

von Karl H. (kbuchegg)


Lesenswert?

MWS schrieb:
>> Bist du sicher?
> Nur was das Datenblatt mir sagt, ich würde keine Abweichung um -42%
> erwarten, 10% vielleicht.

Vom 12-er ist das Datenblatt bei Atmel nicht mehr online. Kann daher 
nicht nachsehen. Aber das Teil ist uralt!

Nehmen wir mal von 13-er die OSCCAL Einstellung her
1
OSCCAL Value      Typical Lowest Frequency             Typical Highest Frequency
2
               with Respect to Nominal Frequency    with Respect to Nominal Frequency
3
4
   0x00                  50%                                100%
5
   0x3F                  75%                                150%
6
   0x7F                 100%                                200%

also, das sind schon wirklich die Schätzprügel, die du da hast. 10% ist 
bei denen hochpräzise :-)

von spess53 (Gast)


Lesenswert?

Hi

Datenblatt:

'In ATtiny12, the calibrated internal oscillator provides a fixed 1.2 
MHz (nominal) clock at 5V and 25°C.
....

At 5V and 25oC, the pre-programmed calibration byte gives a frequency 
within
± 1% of the nominal frequency.'

MfG Spess

von MWS (Gast)


Lesenswert?

> Aber länger als erwartet.
Du hast 262143 Zyklen in der Simulation zwischen den ISR Aufrufen, das 
entspricht den erwarteten 4.577 Hz. Wenn die Zeit nicht passt, wird dann 
wohl der interne RC um dieses Maß falsch laufen.

Ich würd' übrigens noch Cnt3 zur Sicherheit initialisieren.

> Vom 12-er ist das Datenblatt bei Atmel nicht mehr online. Kann daher
> nicht nachsehen.
Gerade von Atmel runtergeladen.
http://www.atmel.com/dyn/resources/prod_documents/doc1006.pdf

> Aber das Teil ist uralt!
Yep, mit 3 Level Stack :D

von Karl H. (kbuchegg)


Lesenswert?

spess53 schrieb:

> 'In ATtiny12, the calibrated internal oscillator provides a fixed 1.2
> MHz (nominal) clock at 5V and 25°C.
> ....
>
> At 5V and 25oC, the pre-programmed calibration byte gives a frequency
> within
> ± 1% of the nominal frequency.'

:-)
Da gibt es eine wunderschöne Falle.
Hannes! Wo bist du wenn man dich braucht? Ich hab doch das auch nicht 
mehr alles im Kopf.

Du must OSCCAL selber beschreiben. Der dazu notwendige Wert steht im 
Flash(oder EEPROM?) und zwar im letzten Byte. Hannes seine Programmer 
berücksichtigen das, lesen das Byte aus und mergen es in das zu 
programmierende Programm ein. Allerdings lesen seine Tiny-Programme dann 
auch immer diesen Wert aus dem Flash und beschreiben damit den OSCCAL.
Wenn man dann mal eine Programmiersoftware benutzt, die das nicht macht 
... dann hat man die Kalibrierung verloren.

Ich war damals jung und brauchte das Geld. Kurz und gut: Mein Tiny war 
ruckzuck auf 700-800kHz herunten.

von Karl H. (kbuchegg)


Lesenswert?

Karl heinz Buchegger schrieb:
> spess53 schrieb:
>
>> 'In ATtiny12, the calibrated internal oscillator provides a fixed 1.2
>> MHz (nominal) clock at 5V and 25°C.
>> ....
>>
>> At 5V and 25oC, the pre-programmed calibration byte gives a frequency
>> within
>> ± 1% of the nominal frequency.'
>
> :-)
> Da gibt es eine wunderschöne Falle.
> Hannes! Wo bist du wenn man dich braucht? Ich hab doch das auch nicht
> mehr alles im Kopf.
>
> Du must OSCCAL selber beschreiben. Der dazu notwendige Wert steht im
> Flash(oder EEPROM?) und zwar im letzten Byte. Hannes seine Programmer
> berücksichtigen das, lesen das Byte aus und mergen es in das zu
> programmierende Programm ein. Allerdings lesen seine Tiny-Programme dann
> auch immer diesen Wert aus dem Flash und beschreiben damit den OSCCAL.
> Wenn man dann mal eine Programmiersoftware benutzt, die das nicht macht
> ... dann hat man die Kalibrierung verloren.
>
> Ich war damals jung und brauchte das Geld. Kurz und gut: Mein Tiny war
> ruckzuck auf 700-800kHz herunten.

Nochmal im Datenblatt nachgelesen (Danke dafür, ich hab bei Atmel nur 
mehr das Errata zum 12-er gefunden. Hmm)
Atmel schreibt den richtigen OSCCAL Wert ins Signature Byte. Man muss 
selber dafür sorgen, dass der auch im OSCCAL Register landet!
Weiß das wer: Macht BASCOM das?

von Charly B. (charly)


Lesenswert?

wieso iss das datenblatt nimi online ?

guggst du da :

http://www.atmel.com/atmel/acrobat/doc1006.pdf

von Karl H. (kbuchegg)


Lesenswert?

Charly B. schrieb:
> wieso iss das datenblatt nimi online ?

Ich weiß nicht.
Ich hab wahrscheinlich mit dem Weißen vom Auge geschaut.

von Charly B. (charly)


Lesenswert?

jaja, der wald & die baeume  hihihi


aber i weiss nicht warum fred son stress macht statt an das teil
ein Quarz f. 18 Cent dranzuhaengen, selbst wenn er 100 st.
davon baut sind das 18€ kein preis im vergleich zu der 'energie'
die er bis jetzt wg. des RC osc. reingesteckt hat.........
und wenn du es genau brauchst kommste am quarz sowieso
nicht vorbei

vielleicht sollte man mal darueber nachdenken, oder ?

vlg
Charly

von MWS (Gast)


Lesenswert?

> Weiß das wer: Macht BASCOM das?
Meines Wissens gibt's da nix unter Bascom.

> hab bei Atmel nur mehr das Errata zum 12-er gefunden.
Ein Google nach "Atmel <Prozessortyp>" bringt meist als ersten Link 
genau das Gewünschte.

von Fred vom J. (andreasluebbers)


Lesenswert?

MWS schrieb:
> Du hast 262143 Zyklen in der Simulation zwischen den ISR Aufrufen, das
> entspricht den erwarteten 4.577 Hz. Wenn die Zeit nicht passt, wird dann
> wohl der interne RC um dieses Maß falsch laufen.

In der Simulation lief das Programm? Wie soll das mit dem Prescaler denn 
funktionieren? Wie gesagt, soll beim starten Portb.1 für 10sec auf high 
legen, dann 24h ruhen und dann wieder für 10sec auf high....

von Karl H. (kbuchegg)


Lesenswert?

MWS schrieb:
>> Weiß das wer: Macht BASCOM das?
> Meines Wissens gibt's da nix unter Bascom.
>
>> hab bei Atmel nur mehr das Errata zum 12-er gefunden.
> Ein Google nach "Atmel <Prozessortyp>" bringt meist als ersten Link
> genau das Gewünschte.

Da bin ich dann zu kompliziert :-)
Ich hangle mich bei Atmel zu
http://www.atmel.com/dyn/products/datasheets.asp?family_id=607
durch.

von Karl H. (kbuchegg)


Lesenswert?

Fred vom Jupiter schrieb:

> In der Simulation lief das Programm? Wie soll das mit dem Prescaler denn
> funktionieren?

So wie immer

Der Timer läuft mit

  Systemtakt / Prescaler

Systemtakt ist bei dir 1.2Mhz
Prescaler ist 1024

Also wird der Timer mit einer Frequenz von 1171.875 Hz erhöht.

Der Timer zählt jeweils von 0 bis 255, macht also 256 Zählschritte. 
Danach kommt ein Overflow.

1171.875 / 256 = 4.57 zerquetschte Hz

Mit dieser Frequenz kommen also die Overflows und damit die Aufrufe der 
zugehörigen ISR daher. 4.58 Hz heißt, dass du in 1 Sekunde 4.5 Overflows 
kriegst. Du willst 10 Sekunden, also zählt man einfach in der ISR mit. 
Nach dem 46. Overflow sind daher ~10Sekunden vergangen.

von Fred vom J. (andreasluebbers)


Lesenswert?

Jetzt versteh ich die Logic,....und wie soll der Timer dabei auf 24h 
kommen? Macht ja einmal die 46 Perioden, dann die 33 und 150. Sind das 
insgesamt 86400 sec (24h). Oder muß ich da im Hintergrund auch immer 
bedenken das der Overflow erst nach 256 durchläufen kommt?

Karl heinz Buchegger schrieb:
> Mit dieser Frequenz kommen also die Overflows und damit die Aufrufe der
> zugehörigen ISR daher. 4.58 Hz heißt, dass du in 1 Sekunde 4.5 Overflows
> kriegst. Du willst 10 Sekunden, also zählt man einfach in der ISR mit.
> Nach dem 46. Overflow sind daher ~10Sekunden vergangen.

von Karl H. (kbuchegg)


Lesenswert?

Fred vom Jupiter schrieb:
> Jetzt versteh ich die Logic,....und wie soll der Timer dabei auf 24h
> kommen?

Falk hat ja auch noch weitere Zähler mitlaufen.
Nur dann wenn die alle 0 sind, wird der Ausgang 1
ansonsten ist er 0.

Und dann zählt er mit den anderen Zählern weiter.

Nach 6 Stück 10 Sekunden Perioden ist man bei 1 Minute, die werden 
wieder weitergezählt, etc ....
Die genauen Werte musst du dir aus dem Programm auslesen, aber im Grunde 
passiert nichts anderes, als das die ISR 10 Sekundenintervalle abzählt, 
bis 24h vergangen sind. Ist doch immer wieder dasselbe Prinzip.

von MWS (Gast)


Lesenswert?

> In der Simulation lief das Programm? Wie soll das mit dem Prescaler denn
> funktionieren?
AVR Studio simuliert Timer und Interrupts von Haus aus, der Bascom 
Simulator besitzt die Option Sim Timers. Wenn die simuliert werden, 
dann natürlich mit dem eingestellten Prescaler. Wenn man dann einen 
Haltepunkt an den Beginn der ISR setzt, kann man die vergangenen Zyklen 
sehen.

Beim ersten Erreichen der 46 wird der Portpin gesetzt, nach weiteren 10 
Sekunden, beim nächsten Erreichen der 46 wieder gelöscht.

Das hier für den 24 Stunden Code sieht mir unbrauchbar aus:
1
      'If Cnt2 = 0 Then
2
      '   Cnt3 = Cnt3 + 1
3
      '   If Cnt3 = 33 And Cnt2 = 150 Then
Der Bedingungsblock wird nur durchlaufen, wenn Cnt2 = 0 ist, eine 
Prüfung auf 150 kann dann nie zutreffen.

Das erste If Cnt1 = 0 ... hättest Du Dir hingegen sparen können, denn 
unmittelbar vorher setzt Du es ja auf 0. Was für einen anderen Wert 
außer 0 soll es denn dann haben ? :-)
1
     Cnt1 = 0
2
      If Cnt1 = 0 And Cnt2 = 0 And Cnt3 = 0 Then

@Karl Heinz
> Da bin ich dann zu kompliziert :-)
Bei der Google Suche geht man immer dann ein, wenn man Begleitfiles zu 
einer Appnote sucht, da hilft dann nur durchhangeln.

von Fred vom J. (andreasluebbers)


Lesenswert?

MWS schrieb:
> Das hier für den 24 Stunden Code sieht mir unbrauchbar aus:      'If Cnt2 = 0 
Then
>
>       '   Cnt3 = Cnt3 + 1
>
>       '   If Cnt3 = 33 And Cnt2 = 150 Then Der Bedingungsblock wird nur 
durchlaufen, wenn Cnt2 = 0 ist, eine
> Prüfung auf 150 kann dann nie zutreffen.
>
> Das erste If Cnt1 = 0 ... hättest Du Dir hingegen sparen können, denn
> unmittelbar vorher setzt Du es ja auf 0. Was für einen anderen Wert
> außer 0 soll es denn dann haben ? :-)     Cnt1 = 0
>
>       If Cnt1 = 0 And Cnt2 = 0 And Cnt3 = 0 Then


Wie würde das nach Deiner Meinung denn richtig funktionieren. Möchte 
jetzt nicht hinter einem Quellcode herbetteln, aber wenn man einen 
funktionstüchtigen Code hat kann mir der Programmablauf erst richtig 
klar werden. Und da habe ich derzeit so meine Probleme.

von Karl H. (kbuchegg)


Lesenswert?

Fred vom Jupiter schrieb:

> Wie würde das nach Deiner Meinung denn richtig funktionieren. Möchte
> jetzt nicht hinter einem Quellcode herbetteln, aber wenn man einen
> funktionstüchtigen Code hat kann mir der Programmablauf erst richtig
> klar werden.

Und gelernt hast du dabei gar nichts.

Denk selber nach. Ein bischen rechnen wirst du soch auch selber können.

> Und da habe ich derzeit so meine Probleme.

Eben. Und darum solltest du das selber machen.

Wieviele 10 Sekunden Intervalle gibt es in 24 Stunden?
Und diese Anzahl musst du auf entsprechend viele Zählvariablen 
aufteilen, so dass keine weiter als bis 255 zählen muss.

Der Rest funktioniert wie bei einer Uhr
Nach 60 Sekunden ist 1 Minute vergangen. D.h. die Sekunden fangen wieder 
bei 0 an und die Minuten werden um 1 hochgezählt. Nach 60 Minuten ist 1 
Stunde vergangen, d.h. die Minuten werden wieder auf 0 gesetzt und die 
Stunden um 1 hoch. Nach 24 Stunden wird alles auf 0 gesetzt, das nächste 
24 Stunden INtervall beginnt (und der Ausgang wird für 10 Sekunden auf 1 
gesetzt).


Selber machen!
Nicht darauf warten, dass dir alles im Detail vorgekaut wird.

von MWS (Gast)


Lesenswert?

> aber wenn man einen funktionstüchtigen Code hat kann mir der
> Programmablauf erst richtig klar werden.
Na, wenn Du denn hast, dann wärst Du ja schon fertig :D

Der Block um Cnt2 ist schon noch ok, nur kann eben besagte Bedingung 
darin nie wahr werden. Also muss diese Bedingung aus diesem Block raus 
und dahinter.

Wobei ich auch mit Deiner Rechnung nicht ganz einverstanden bin, denn 
ein Tag hat 86400 Sekunden, alle 10 Sekunden ein Interrupt, sind 8640 
Aufrufe, Cnt2 braucht 256 Zyklen pro Durchlauf, das sind 33 Durchläufe 
für Cnt3 und ein Rest von 192 für Cnt2. Wobei's möglicherweise 
Erbsenzählen ist, solange der RC Oszillator nicht einigermaßen genau 
läuft.

von Falk B. (falk)


Angehängte Dateien:

Lesenswert?

Hier nochmal die neue Version, sollte jetzt passen.

MFg
Falk

von Fred vom J. (andreasluebbers)


Lesenswert?

Karl heinz Buchegger schrieb:
> Selber machen!
> Nicht darauf warten, dass dir alles im Detail vorgekaut wird.

Wie recht Du doch hast, fördern durch fordern!

von Fred vom J. (andreasluebbers)


Lesenswert?

Falk Brunner schrieb:
> Hier nochmal die neue Version, sollte jetzt passen.

Läuft nicht in der Praxis, und keiner weiß warum !?

Enable Timer0
Enable Interrupts
Start Timer0

' Endlosschleife
Do
Loop

End

' Timer Interrupt 1.2MHz/1024/256 = 4,577Hz (=218,4ms)
Tim0_isr:
  Cnt1 = Cnt1 + 1
  If Cnt1 = 46 Then                                         ' DIV 46 
->1/10,04s
      Portb.1 = 1
      Else
      Portb.1 = 0
      End If
      Return

Selbst dieser int. allein läuft nicht!

von MWS (Gast)


Angehängte Dateien:

Lesenswert?

Welche Bascom Version ?

Flash das hex in den µC, toggelt die Led mit 4,6 Hz

von Fred vom J. (andreasluebbers)


Lesenswert?

Version 1.11.9.8
Keine Ahnung warum nix läuft, Habe das Ganze schonmal Ersatzweise mit 
Mega8 eingespielt, genau das selbe Problem. Es läuft nicht !!!!!

von Fred vom J. (andreasluebbers)


Lesenswert?

MWS schrieb:
> Flash das hex in den µC, toggelt die Led mit 4,6 Hz

LED Blinkt!
Meine Ausrüstung:
Pollin Evalutionboard, Bascom Versin 1.11.9.8, Eingespielt wird über 
PonyProg

von MWS (Gast)


Lesenswert?

> Mega8 eingespielt, genau das selbe Problem.
Das wiederum sollte nicht sein.

Wieso frickelst Du eigentlich mit einem SRam-losen Baustein rum ? Lag 
der gerade da ? Nimm Tiny13, da hast Du die Scherereien nicht.

Gerade noch bemerkt, daß der Code versucht die ganzen Register zu 
sichern, da muss die ISR mit Nosave aufgerufen werden, also:
1
On Ovf0 Tim0_isr Nosave

Ich seh' mir noch den Code durch, damit das nicht noch weitere Probleme 
hat.

> Version 1.11.9.8

Mach ein Update, Ver 1.12.0.0 ist aktuell

von Falk B. (falk)


Lesenswert?

@  Fred vom Jupiter (andreasluebbers)

>Keine Ahnung warum nix läuft, Habe das Ganze schonmal Ersatzweise mit
>Mega8 eingespielt, genau das selbe Problem. Es läuft nicht !!!!!

Wie lange hast du denn gewartet? Selbst ein Schnelldurchlauf dauert 
knapp eine Minute . . .

von MWS (Gast)


Lesenswert?

Falk, da gibt's ein Problem, in der ISR wird PUSH und POP verwendet, das 
sollte nicht klappen, denn der Tiny12 hat keinen richtigen Stack. Das 
ist ein Baustein, der für Bascom nix richtiges ist und für einen 
Anfänger schon zweimal nicht.

von Fred vom J. (andreasluebbers)


Lesenswert?

Habe mich für den Tiny12 entschieden weil die Platine so klein wie 
möglich gehalten werden muß. Aber wie gesagt, der Atmega8 läuft mit dem 
Quellcode ja auch nicht.

von Falk B. (falk)


Lesenswert?

@  MWS (Gast)

>sollte nicht klappen, denn der Tiny12 hat keinen richtigen Stack. Das
>ist ein Baustein, der für Bascom nix richtiges ist und für einen
>Anfänger schon zweimal nicht.

Wohl wahr. Na dann vergessen wir das Teil.

MFG
Falk

von MWS (Gast)


Angehängte Dateien:

Lesenswert?

> Habe mich für den Tiny12 entschieden weil die Platine so klein wie
> möglich gehalten werden muß.

Untaugliches Kriterium, da der Tiny13 genauso groß ist, aber dafür SRam 
hat.

Ich bin auch dagegen fertigen Code zu liefern, aber diese zusätzlichen 
Hürden zu überwinden hast Du als Anfänger keine Chance.

Durch die Umstellung der Logik können die unbrauchbaren Opcodes 
vermieden werden. Das erzeugte .bin im Anhang, für den Fall, daß die 
Bascom Version zu alt ist.
1
$regfile = "attiny12.dat"
2
$crystal = 1200000
3
$noramclear
4
$swstack = 0
5
$framesize = 0
6
7
Dim Cnt1 As Iram Byte
8
Dim Cnt2 As Iram Byte
9
Dim Cnt3 As Iram Byte
10
11
Config Timer0 = Timer , Prescale = 1024
12
On Ovf0 Tim0_isr Nosave
13
Config Portb.1 = Output
14
15
Cnt1 = 0
16
Cnt2 = 0
17
Cnt3 = 0
18
19
Enable Timer0
20
Enable Interrupts
21
Start Timer0
22
23
' Endlosschleife
24
Do
25
Loop
26
27
End
28
29
' Timer Interrupt 1.2MHz/1024/256 = 4,577Hz (=218,4ms)
30
Tim0_isr:
31
  Cnt1 = Cnt1 + 1
32
  If Cnt1 = 46 Then                                         ' DIV 46 ->1/10,04s
33
      Cnt1 = 0
34
35
'      If Cnt2 = 0 And Cnt3 = 0 Then
36
      If Cnt2 <> 0 Then Goto Port_Clear
37
      If Cnt3 <> 0 Then Goto Port_Clear
38
         Portb.1 = 1
39
           Goto Port_End
40
      Port_Clear:
41
         Portb.1 = 0
42
      Port_End:
43
44
      Cnt2 = Cnt2 + 64
45
      If Cnt2 <> 0 Then Goto Ctr3_No_Inc
46
'      If Cnt2 = 0 Then
47
         Cnt3 = Cnt3 + 1
48
      Ctr3_No_Inc:
49
50
      If Cnt3 <> 1 Then Goto Ctrs_No_Reset
51
      If Cnt2 <> 0 Then Goto Ctrs_No_Reset
52
'      If Cnt3 = 1 And Cnt2 = 0 Then
53
         Cnt3 = 0
54
         Cnt2 = 0
55
      Ctrs_No_Reset:
56
  End If
57
Return

von Falk B. (falk)


Angehängte Dateien:

Lesenswert?

@  Fred vom Jupiter (andreasluebbers)

>Habe mich für den Tiny12 entschieden weil die Platine so klein wie
>möglich gehalten werden muß.

Es gibt andere in SO8, tiny13 & Co.

> Aber wie gesagt, der Atmega8 läuft mit dem Quellcode ja auch nicht.

Logisch, weil da einige Sachen für den Tiny drin sind. Probier mal den 
Anhang.

MFG
Falk

von Fred vom J. (andreasluebbers)


Lesenswert?

Danke Falk, der erste Code der funktioniert. Im Atmega8. Werde jetzt mal 
schauen ob es auch im Tiny12 nach kleinen veränderungen geht. Oder ist 
das hoffungslos?
Würde der tiny13 einfacher sein, bzw. überhaupt die Voraussetzung mit 
sich bringen?

von Fred vom J. (andreasluebbers)


Lesenswert?

MWS schrieb:
> Das erzeugte .bin im Anhang, für den Fall, daß die
> Bascom Version zu alt ist.

Damit läuft er aber immer noch nicht!

von Falk B. (falk)


Lesenswert?

@  Fred vom Jupiter (andreasluebbers)

>Danke Falk, der erste Code der funktioniert. Im Atmega8.

Schön.

>Werde jetzt mal
>schauen ob es auch im Tiny12 nach kleinen veränderungen geht. Oder ist
>das hoffungslos?

Vergiss es.

>Würde der tiny13 einfacher sein, bzw. überhaupt die Voraussetzung mit
>sich bringen?

Ja, der wird normal von BASCOM unterstützt, weil er SRAM hat.

MFG
Falk

von MWS (Gast)


Lesenswert?

> Damit läuft er aber immer noch nicht!
Kein Mucks ? Nicht nach 10 Sekunden mal die Led an ?

von MWS (Gast)


Lesenswert?

Keine Antwort mehr ? Hmm, sowas, jetzt hab' ich's gerade noch mit 
Assembler zum Laufen gebracht :D
Waren noch Illegal Opcodes drin, Bascom ist ganz definitiv nix mehr für 
den Tiny12.

Dann mal viel Erfolg mit dem Tiny13 ;-)

von Fred vom J. (andreasluebbers)


Lesenswert?

War noch unterwegs,....wenn Du es mit Tin12 hinbekommen hast dann nur 
herdamit! Würde ich gerne mal testen. Ist echt total panne,....wieviel 
Zeit man investieren muß für so eine "kleine" Schaltung.
Die Schaltung von Falk mit Atmega8 läuft,....wäre nur zu schön die 
Schlatung mit Attiny12 zum laufen zu bringen, gerade weil ich die 
Platine extra dafür fertig gemacht habe. (Würde mit Attiny13 zwar auch 
gehen, müßte ich aber wieder bestellen)
Also ich würde vor freude im Dreieck springen wenns damit funktioniert

von Karl H. (kbuchegg)


Lesenswert?

Fred vom Jupiter schrieb:
> War noch unterwegs,....wenn Du es mit Tin12 hinbekommen hast dann nur
> herdamit! Würde ich gerne mal testen. Ist echt total panne,....wieviel
> Zeit man investieren muß für so eine "kleine" Schaltung.
> Die Schaltung von Falk mit Atmega8 läuft,....wäre nur zu schön die
> Schlatung mit Attiny12 zum laufen zu bringen, gerade weil ich die
> Platine extra dafür fertig gemacht habe. (Würde mit Attiny13 zwar auch
> gehen, müßte ich aber wieder bestellen)
> Also ich würde vor freude im Dreieck springen wenns damit funktioniert

Na ja.
Das Programm ist ja so kompliziert auch wieder nicht.
Hauptproblem ist, dass es ein Hochsprachencompiler mit dem Tiny12 mit 
seinen engen Limits und Weglassungen sehr schwer hat.
Da aber die Aufgabe an sich nicht schwer ist, wäre es ein perfekter 
Kandidat um auf einem Tiny12 in Assembler umgesetzt zu werden: Es muss 
nicht viel gerechnet werden und wenn beschränkt sich das auf 
Incrementieren und Vergleichen. All das ist in Assembler auch keine 
Hexerei.

von Peter D. (peda)


Lesenswert?

Karl heinz Buchegger schrieb:
> Mein erster AVR war auch ein Tiny12. Wenn mich mein Gedächtnis nicht
> täuscht, machte der so um die 700 bis 800kHz. Erst nachdem ich den OSCAL
> hochgedreht hatte, kam ich auf über 1Mhz.

OSCCAL wird nicht automatisch geladen und steht damit nach einem Reset 
auf ganz langsam.
Du brauchst einen Programmer, der den Wert auslesen kann und dann mußt 
Du ihn händisch in Deinen Quellcode übernehmen.

Bei einem frischen ATtiny12 steht er aber auch in der letzten 
Flash-Adresse.
Eine Applikation kann ihn dort auslesen und damit OSCCAL setzen, man muß 
dafür aber das Löschen vor dem Programmieren ausschalten!


Peter

von MWS (Gast)


Lesenswert?

> All das ist in Assembler auch keine Hexerei.
Nö :-) Vor allem, da's sowieso schon passend umgestellt war, um die 
PUSH/POPs zu vermeiden. Hatte nur die LDs übersehen, die mir der 
Compiler reingewurschtelt hat und die beim Tiny12 auch nicht gehen.

Hatt's jetzt nochmal aus dem Gedächtnis nachgeschrieben, denn ich hab' 
meinen Arbeitsplatz heut' schon verlassen (dürfen).

Ich denk' es ist fehlerfrei, ohne schädlichen Opcodes :D
Wenn nicht, wird das Forum sicher seinen Teil dazu beitragen.
1
$regfile = "attiny12.dat"
2
$crystal = 1200000
3
$noramclear
4
$swstack = 0
5
$framesize = 0
6
7
Cnt1 Alias R16
8
Cnt2 Alias R17
9
Cnt3 Alias R18
10
Tmp Alias R19
11
12
Const Cnt1_Limit = 46
13
Const Cnt1_Preload = Cnt1_Limit - 1
14
15
Config Timer0 = Timer , Prescale = 1024
16
On Ovf0 Tim0_isr Nosave
17
Config Portb.1 = Output
18
19
  !LDI     Cnt1,     Cnt1_Preload                           ' 45
20
'Cnt1 = 0
21
22
  !LDI     Cnt2,     0
23
'Cnt2 = 0
24
25
  !LDI     Cnt3,     0
26
'Cnt3 = 0
27
28
Enable Timer0
29
Enable Interrupts
30
Start Timer0
31
32
' Endlosschleife
33
Do
34
Loop
35
36
End
37
38
' Timer Interrupt 1.2MHz/1024/256 = 4,577Hz (=218,4ms)
39
Tim0_isr:
40
  !INC     Cnt1
41
'  Cnt1 = Cnt1 + 1
42
43
  !CPI     Cnt1,     Cnt1_Limit                             ' 46
44
  !BRNE    ISR_End
45
'  If Cnt1 = 46 Then                                         ' DIV 46 ->1/10,04s
46
47
  !LDI     Cnt1,     0
48
'      Cnt1 = 0
49
50
  !CPI     Cnt2,     0
51
  !BRNE    Port_Clear
52
'      If Cnt2 <> 0 Then Goto Port_Clear
53
54
  !CPI     Cnt3,     0
55
  !BRNE    Port_Clear
56
'      If Cnt3 <> 0 Then Goto Port_Clear
57
58
  !SBI     PORTB,    1
59
'         Portb.1 = 1
60
61
  !RJMP   Port_End
62
'           Goto Port_End
63
64
!Port_Clear:
65
  !CBI     PORTB,    1
66
'         Portb.1 = 0
67
!Port_End:
68
69
  !LDI     Tmp,      64
70
  !ADD     Cnt2,     Tmp
71
'      Cnt2 = Cnt2 + 64
72
73
  !CPI     Cnt2,     0
74
  !BRNE    Ctr3_No_Inc
75
'      If Cnt2 <> 0 Then Goto Ctr3_No_Inc
76
77
  !INC     Cnt3
78
'         Cnt3 = Cnt3 + 1
79
!Ctr3_No_Inc:
80
81
  !CPI     Cnt3,     1
82
  !BRNE    Ctrs_No_Reset
83
'      If Cnt3 <> 1 Then Goto Ctrs_No_Reset
84
85
  !CPI     Cnt2,     0
86
  !BRNE    Ctrs_No_Reset
87
'      If Cnt2 <> 0 Then Goto Ctrs_No_Reset
88
89
  !LDI     Cnt3,     0
90
'         Cnt3 = 0
91
92
  !LDI     Cnt2,     0
93
'         Cnt2 = 0
94
95
  !LDI     Cnt1,     Cnt1_Preload                           ' 45
96
!Ctrs_No_Reset:
97
!ISR_End:
98
Return

von Peter D. (peda)


Lesenswert?

Man kann das aber auch ganz einfach in Assembler schreiben:
1
.nolist
2
.include "tn12def.inc"
3
4
        .equ    XTAL = 1200000        ; 1.2MHz
5
6
        .equ    zeit1 = 10            ; 10s
7
        .equ    zeit2 = 60 * 60 * 24  ; 24h
8
9
.macro  warte
10
        ldi     r16, byte1( @0 / 6)
11
        ldi     r17, byte2( @0 / 6)
12
        ldi     r18, byte3( @0 / 6)
13
        ldi     r19, byte4( @0 / 6)
14
_warte11:
15
        subi    r16, byte1(1)         ; 1 Zyklus
16
        sbci    r17, byte2(1)         ; 1 Zyklus
17
        sbci    r18, byte3(1)         ; 1 Zyklus
18
        sbci    r19, byte4(1)         ; 1 Zyklus
19
        brne    _warte11              ; 2 Zyklen
20
                                      ; = 6 Zyklen
21
.endmacro
22
.list
23
.listmac
24
25
26
main:
27
        sbi     ddrb, pb1
28
loop1:
29
        sbi     portb, pb1
30
        warte   XTAL * zeit1          ; 10s
31
        cbi     portb, pb1
32
loop2:
33
        ldi     r20, 240              ; 240 * 6min = 24h
34
        warte   XTAL * zeit2 / 240    ; 6min
35
        dec     r20
36
        brne    loop2
37
        rjmp    loop1


Peter

von MWS (Gast)


Lesenswert?

> Man kann das aber auch ganz einfach in Assembler schreiben:
Klar kann man. Nun, ich dachte daran daß Assemblercode in gewohnter 
Umgebung mit den entsprechenden Kommentaren versehen erstens vom TO 
besser verstanden, und zweitens dadurch für ihn auch anpassbar sein 
wird. Drittens natürlich, daß mir die Basic/Assembler-Kombination liegt.

Du kannst meinen Code lesen, ich kann Deinen verstehen, nur kann der TO 
das auch ? Wobei mir die Aufgabe des Tagestimers und das Interesse dafür 
doch sehr projektbezogen aussieht und ich nicht darauf wetten würde, daß 
der TO die µC-Programmierung freiwillig weiterverfolgt wenn er nicht 
muss.

Aber jetzt hat er ja zwei Versionen :D

von Charly B. (charly)


Lesenswert?

hab mir das (Sklaven)treiben hier mal angesen;

Fred vom Jupiter schrieb:
> Habe mich für den Tiny12 entschieden weil die Platine so klein wie
> möglich gehalten werden muß.
der attiny85 ist genauso gross, FAULE AUSREDE, i denk so kannst du
mehr auf hilflos machen und andere haben dir das programm geschrieben,
nicht dumm; aber meiner meinung nach eine frechheit....

> Ist echt total panne,....wieviel Zeit man investieren muß für
> so eine "kleine" Schaltung.
OH, war das warten auf fertige Programme SOOO schlimm ?

ich bin der meinung du hast noch nicht einmal versucht was
wirklich selber zu machen oder die erhaltenen Programme zu
verstehen, nur die aussage :'läuft nicht' oder
'läuft immer noch nicht' .....

> Also ich würde vor freude im Dreieck springen wenns
> damit funktioniert.
Ich wuerd vorschlagen du schickst Falk z.B. mal 50€ damit er
mit seiner Frau vielleicht mal einen netten Abend verbringt,
als Dankeschoen, oder ?


> Aber wie gesagt, der Atmega8 läuft mit dem
> Quellcode ja auch nicht.
welcher Quellcode ?

von Fred vom J. (andreasluebbers)


Lesenswert?

Charly B. schrieb:
> Ich wuerd vorschlagen du schickst Falk z.B. mal 50€ damit er
> mit seiner Frau vielleicht mal einen netten Abend verbringt,
> als Dankeschoen, oder ?

Vielleicht sollte ich Dir 50€ zukommen lassen, wenn man schon nachts vor 
so einer Aufgabe sitz. Scheinst wohl keine Frau zu haben.
Aber interesse haste wohl schon dir die ganzen Beiträge durchzulesen. 
Maulheld!

von Peter D. (peda)


Lesenswert?

Ich habs nochmal ausprobiert, der Assembler rechnet Konstanten mit 64Bit 
aus.
Man kann also alle 5 Zählbytes in das Delaymacro packen und dann bis max 
7696581394432 Zyklen warten (74 Tage).


Peter

von spess53 (Gast)


Lesenswert?

Hi

>        ldi     r16, byte1( @0 / 6)

Byte1 gibt es nicht. Da muss  'Low( @0 / 6)' hin.

MfG Spess

von Peter D. (peda)


Lesenswert?

spess53 schrieb:
> Byte1 gibt es nicht. Da muss  'Low( @0 / 6)' hin.

Dann mußt Du das mal Atmel sagen, damit sie es aus dem Assembler 
entfernen.
Es gehts jedenfalls.
Ulkiger Weise steht es aber nicht mehr in der AVRStudio Hilfe drin.


Peter

von Oliver N. (nixo2)


Lesenswert?

Wo sind die Analog-Experten, die die Problemstellung mit R/C-Glied / 
Logik / NE555 lösen können?

Grüße
Oliver

von spess53 (Gast)


Lesenswert?

Hi

>Es gehts jedenfalls.

Stimmt.

>Ulkiger Weise steht es aber nicht mehr in der AVRStudio Hilfe drin.

Aber schon seit längerem.

MfG Spess

von Peter D. (peda)


Lesenswert?

Hier nochmal etwas hübsch gemacht mit langem Delay-Macro:
1
.nolist
2
.include "tn12def.inc"
3
4
        .equ    F_CPU = 1200000       ; 1.2MHz
5
6
        .equ    zeit1 = 10            ; 10s
7
        .equ    zeit2 = 60 * 60 * 24  ; 24h
8
9
#define byte5(x)  byte4(x / 256)
10
11
.macro  warte
12
        ldi     r16, byte1( @0 / 7 )
13
        ldi     r17, byte2( @0 / 7 )
14
        ldi     r18, byte3( @0 / 7 )
15
        ldi     r19, byte4( @0 / 7 )
16
        ldi     r20, byte5( @0 / 7 )
17
_warte11:
18
        subi    r16, byte1(1)         ; 1 Zyklus
19
        sbci    r17, byte2(1)         ; 1 Zyklus
20
        sbci    r18, byte3(1)         ; 1 Zyklus
21
        sbci    r19, byte4(1)         ; 1 Zyklus
22
        sbci    r20, byte5(1)         ; 1 Zyklus
23
        brne    _warte11              ; 2 Zyklen
24
                                      ; = 7 Zyklen
25
.endmacro
26
.list
27
.listmac
28
29
30
main:
31
        sbi     ddrb, pb1
32
        sbi     portb, pb1
33
        warte   F_CPU * zeit1         ; 10s
34
        cbi     portb, pb1
35
        warte   F_CPU * zeit2         ; 1d
36
        rjmp    main


Peter

von Karl H. (kbuchegg)


Lesenswert?

Wenn man pingelig ist, müsste es doch lauten

        .equ    zeit2 = 60  60  24 - 10  ; 24h

weil ja 10 Sekunden für die Ein-Phase drauf gegeangen sind.

von Paul Baumann (Gast)


Lesenswert?

@Fred vom Jupiter

Ein Tag auf dem Jupiter ist aber nur 9,84 Stunden lang. Du mußt doch 
auch
unheimliche Portokosten haben, wenn Du Dir die Kontroller liefern 
läßt...
;-)
MfG Paul

von Fred vom J. (andreasluebbers)


Lesenswert?

Über Hermes ist das am billigsten,....

von Oliver N. (nixo2)


Lesenswert?

Saturn dürfte aber näher dran sein... ;-)

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.