PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Einfache Blinkschaltung für ATTiny13



Jannes M-Sp
23.06.2006, 15:37
Ich brauche mal wieder eure Hilfe:

Also zum Realen Problem
Ich will bei meine 1:87 Modellautos elektrifizieren. Für die Blinklichter will ich mir Flipfloppschaltung usw. sparen und das ganze über AVRs lösen. Es solle recht einfach werden, so bald ich Strom gebe soll alles Blinken was eine LED dahinter hat. Natürlich gibt es unterschiedliche Blinkfolgen, deshalb müssen mehrere Ausgänge des Tinys parallel den Strom aussenden.


Die einzelnen Ports sollen nach folgendem Muster Strom geben:

Einleitung

$regfile "attiny13.dat"

'Angabe der Taktfrequenz (1Mhz)
$crystal = 1200000 'die Taktfrequenz musst Du noch richtig setzen
$hwstack = 16

Dim A As Byte
Dim B As Integer
Dim C As Byte
Dim Zaehler As Byte
Dim Zeit2 As Byte
Dim Zeit3 As Byte
Dim Zeit4 As Byte

A = 50
B = 500
C = 35

Zeit2 = C * 2
Zeit3 = C * 3
Zeit4 = C * 4

Config Portb = &B01111

Blinkfrequenz für den PortB1

Do 'Doppelblitz
Portb.1 = 1
Waitms A
Portb.1 = 0
Waitms A
Portb.1 = 1
Waitms A
Portb.1 = 0
Waitms B
Loop

Blinkfrequenz für den PortB2

Do 'Blaulicht Port.b2!
Portb.2 = 1
Waitms A
Portb.2 = 0
Waitms B
Loop

Blinkfrequenz für den PortB3

Do 'Warnblink
Portb.3 = 0
Waitms B
Portb.3 = 1
Waitms B
Loop

Blinkfrequenz für den PortB4

Do 'Triblitz 1.Strobo
Portb.4 = 0
Waitms B
Portb.4 = 1
Waitms C
Portb.4 = 0
Waitms C
Portb.4 = 0
Waitms C
Portb.4 = 0
Waitms C
Portb.4 = 0
Waitms C
Portb.4 = 0
Waitms C
Loop

Blinkfrequenz für den PortB5

Do 'Triblitz 2.Strobo
Portb.5 = 0
Waitms B
Portb.5 = 0
Waitms C
Portb.5 = 0
Waitms C
Portb.5 = 1
Waitms C
Portb.5 = 0
Waitms C
Portb.5 = 0
Waitms C
Portb.5 = 0
Waitms C
Loop

Blinkfrequenz für den PortB6 (Wegen Reset nicht aktiv während des Testens)

Do 'Triblitz 3.Strobo
Portb.6 = 0
Waitms B
Portb.6 = 0
Waitms C
Portb.6 = 0
Waitms C
Portb.6 = 0
Waitms C
Portb.6 = 0
Waitms C
Portb.6 = 1
Waitms C
Portb.6 = 0
Waitms C
Loop

Da es ja alles Do-Loop-Schleifen sind wird das Script ja nur bis zum ersten Loop abgespielt und alles weitere nicht berücksichtigt. Ich habe leider recht wenig Ahnung vom Programmieren, bin so ein richtiger Anfänger. Nun will ich ja dass an allen Pins entsprechend des Scripts Strom gegeben wird, ich weiß nur nicht wie man das macht.

MfG O:)
Jannes

Marco78
23.06.2006, 18:48
Also...

Du kannst im Programm Labels setzen.


Main:
und hier den Code einfügen.....

Sub1:
Code für SUb1.....

Blink1:
Code für erste Blinkfolge....

Blink2:
Code für zweite Blinkfolge.....

Die Labels (Main:, Sub1:, ...) kannst du mit Goto und Gosub anspringen.

Nach Gosub in ein Label kannst bzw musst du mit Return zurückspringen. Dann geht das Programm dahin wo du weggesprungen bist.

Nach Goto gibt es kein zurück wie bei Gosub.

Den Name des Labels kannst du dir selbst aussuchen. Das Label im programm muss nach dem Namen ein : haben. Wenn du es ansprichst, darf da kein : hinter sein.


Main:
Gosub Sub1
Gosub Blink1
Gosub Blink2
Goto Main


Sub1:

Hier den Code einfügen

Return 'aus der Subroutine zurückspringen


Blink1:

Code.....

Return


Blink2:

Code.....
Hier könnte auch Gosub Blink1 oder so stehen......

Return

Wichtig ist es aber, das du nicht mit Gosub in ein Label gehst, das kein Return hat, oder mit Return aus ein Label zurück willst, das mit Goto angesprungen wurde!
Da führt der AVR nämnlich irgendwann ein reset aus, weil der Stack übergelaufen ist.

Soviel erstmal zu den Grundlagen.
Ich kann dir folgende Seite mal ans Herz legen: http://www.rowalt.de/mc/index.htm

Um auf dein Problem genauer einzugehen.

Wenn ich das richtig verstanden habe, soll das Auto die ganze Zeit alle Varianten gleichzeitig durchspielen, oder?


Wenn ja, dann wird die Programmierung etwas aufwendiger.

Ein Wait oder Waitms oder Waitus macht im Programm so lange nichts, bis die Zeit abgelaufen ist. Die Zeit ist auch nicht sehr genau, aber das ist in diesem Fall ja nicht so relevant.

Wenn eine LED an ist und 300mS gewartet werden soll, bis sie ausgeschaltet werden soll, wird in dieser Zeit auch wirklich nur gewartet. Durch die unterschiedlichen zeitlichen Abläufe kann es aber sein, das in genau dieser Zeit eine andere LED schon leuchten soll.
Das geht aber nicht, weil der AVR noch wartet.
Also musst du einen Timer verwenden.
Der Timer sollte auf die kleinste gemeinsame "Wartezeit" gestellt werden. Immer wenn die Zeit erreicht ist, wird in die Routine des Timers gesprungen. Dort kannst du dann eine Variable hochzählen und im Hauptprogramm auswerten, welche LED grade geschaltet werden soll.

Timer ist ein etwas komplexeres Thema. Ich will dir aber nicht alles vorkauen. Zum einen findest du mit der Suche viel Information zu Bascom und Timern und außerdem weiss ich ja noch nicht einmal genau, ob wirklich alles auf einmal blinken soll.
Wenn alles der Reihe nach passieren soll, kannst du es auch anders lösen.

Jannes M-Sp
23.06.2006, 22:44
Uiuiui, da hab ich mir aber was ausgedacht...

OK, es scheint komplizierter zu werden. Erstmal danke für die kleine Einführung. Ich werde mich wohl durch eins der Tutorials durcharbeiten müssen.
Es wird ja durchaus vorkommen das zwei oder mehrere LEDs gleichzeitig Blinken. (alleine Warnblinker mit ca 1Hz, Blaulicht mit knapp mehr als 2Hz)

Ich meine, hast du als Profi da denn eine konkrete Möglichkeit vor Augen, oder kann ich als Anfänger das gleich vorerst einstampfen?
Man müsste das ganze auf den "kleinsten gemeinsamen Vielfachen" bringen, damit man das Script zyklisch ablaufen lassen kann. Soweit erstmal, ich melde mich nochmal.

MfG

Marco78
23.06.2006, 23:00
Ich meine, hast du als Profi da denn eine konkrete Möglichkeit vor Augen, oder kann ich als Anfänger das gleich vorerst einstampfen?

Profi bin ich noch lange nicht.
Einstampfen würde ich das an deiner Stelle noch nicht gleich. Kommt aber auch immer auf den einzelenen an, wie motoviert er ist und wie geduldig und wie er lernen kann (nicht wie gut, sondern wie allgemein).

Wie gesagt, ich würd's mit nem Timer machen. Und dann Sequenz für Sequenz ausprobieren und dann versuchen alles zu verbinden.

https://www.roboternetz.de/phpBB2/dload.php?action=file&file_id=169 <--- Das hilft dir schonmal etwas beim Timer. Und der Rest ist dann überlegen, probieren, Fehlschläge einstecken, Erfolge erleben...

Schau mal, was du so schaffst und beim Rest kannst du ja immer noch nachfragen.

PS: Aber 1kB Flash wird da auch bald voll sein.

Jannes M-Sp
24.06.2006, 00:03
Naja, bei der Zeit (und auch dem Geld) die ich schon investiert habe werde ich mit Sicherheit nicht so schnell aufgeben. Nach den Problemen die ich überhaupt erst mit dem ISP hatte dachte ich nur jetzt würde es ganz schnell gehen, aber dann muss ich halt noch etwas weiter rackern, ich habe ja Hilfe ;-).

Ich habe zur Not noch 4x Tiny45, hatte, damit es sich lohnt, gleich eine etwas größere Bestellung gemacht. Wäre nur schade wenn ich die 13er nicht so einsätzen kann, dan hab ich nämlich ein paar zu viele, aber das regelt sich alles.

Morgen werde ich mir mal die Zeit nehmen mir den Forumslink durch zu lesen, hoffentlich stelle ich mich nicht allzu doof an...

MfG Jannes

izaseba
24.06.2006, 00:10
Sowas in der Art hab ich mal für nen Tiny15 in Assembler geschrieben.
Wurde in einem Polizeiautomodell eingesetzt.

Ist zwar wie gesagt Assembler, aber wenn Du willst kann ich es posten.

Gruß Sebastian

Jannes M-Sp
24.06.2006, 00:31
Gerne! Nur ein einzelnes Blaulicht bekomme ich ja auch hin, nur ist es eben mein Problem mehrere Pins Gleichzeitig mit verschiedenen Blinkfrequen laufen zu lassen.

Grüße
Jannes

Marco78
24.06.2006, 07:35
Ich habe zur Not noch 4x Tiny45
Woher denn? Außer wenn von Conrad, dann hat sich die Frage erledigt.

Hanni
24.06.2006, 09:55
[quote]PS: Aber 1kB Flash wird da auch bald voll sein.

Aber nur bei schlechter Programmierung :D

Wie hier schon im Tread angesprochen:

1. Versuche den kleinsen gemeinsamen Nenner zu finden.
2. zähle in der Timer ISR eine Variable hoch
3. einfache Fallunterscheidung, z.B.:

x=0 -> Blaulicht an
x=15 -> Blinker an
x=31 -> Blaulicht aus
x=47 -> Blinker aus

ich könnte die unter umständen ein entsprechendes Beispiel in Assembler posten ... nur stellt sich mir da die Frage ob du das überhaupt willst :D

izaseba
24.06.2006, 10:50
Hallo,
wie versprochen sende ich das Programm,
wohl für den Tiny15, aber ich denke wenn man die tn15def.inc gegen tn13def.inc wechselt
und neu assembliert sollte es ohne Problemme klappen.

Ich hab kleine Änderungen vorgenommen damit das in etwa so geht, wie Du das vor hattest.

Das Programm könnte man noch was optimieren, ich hab es vor einem Jahr geschrieben, aber es klappt gut

Ich hatte es schnell auf dem STK500 aufgebaut, HIER (www.sebastianmazur.de/Polizeiauto.avi) ein kurzes Video davon
(Ja, ja meine Frau hat Ihre Leidenschaft für Videobearbeitung entdeckt :-b )
Wenn du Fragen Hast, her damit.
Ach ja noch ein Wort zu Hardware,
die LED's sind gegen VCC geschaltet, man muß bei dem wegprogrammiertem Reset Pin aufpassen,
er kann nur etwa 15 mA abführen, also entweder LED's die weniger brauchen, oder Treiber Transistoren davorschalten,
und naja, wenn Du kein STK500 oder etwas in der Art hast hast Du nur einen Versuch :-)

Gruß Sebastian

P.S.

Aber 1kB Flash wird da auch bald voll sein.
#-o

Jannes M-Sp
24.06.2006, 12:19
@Marco78:
Die Tinys habe ich von HIER (http://www.embedit.de/). Hab schon bevor ich einen laufenden ISP hatte gleich ein paar mehr bestellt:
7x Tiny13 20pi
2x Tiny13 20si (SMD)
1x Tiny13 20ssi (SMD aber noch kleiner)
5x Tiny45 20pu

Die 13er waren Restposten und vergünstigt, laut dem händler sollen neue 13er und zwar in einer bleifreien Version auf den Markt kommen.

@Hanni:
So etwas wie ich es angehen muss habe ich verstanden. Hab nur Probleme mit so manchen Vokabeln, da muss ich wohl noch ordentlich lernen! Also wenn es dir nichts aus macht, und du es für sinnvoll hältst, würde ich mich über ein Beispiel sehr freuen. Nur brauche ich vermutlich auch eine gute Erklärung damit ich überhaupt durchsteige.

@izaseba:
Ersteinmal ein lautes "GEIL", wenn ich hier den Platz hätte würde ich Purzelbäume schlagen! Das Video zeigt genau was ich brauche!

Verstehe ich es richtig, dass die Pins den Masse Pol darstellen und dauerhaft mit VCC verbunden sind?

Leider habe ich kein STK500, alles was ich zum testen habe sieht so aus:
http://home.arcor.de/einschwein2/Schaltplan%20Testboard.jpg
...wobei der Restpin zum Testen nicht angeschlossen ist.

Wenn ich es richtig sehe kann ich den Chip nur einmal mit dem Programm bespielen? Ist eigendlich kein Problem, bei dem relativ geringen Preis sollen sie eh dauerhaft in die Autos eingebaut werden. Nur muss es halt funktionieren, damit ich nicht reihenweise AVRs verbrate. Deshalb (ich werde mal sehen ob ich das irgendwie hinbekomme und mich nochmal melden) würde ich erstmal den PinB5 RST außenvor lassen, damit ich erstmal sehe ob das bei mir alles funktioniert.
An meinem Testboard muss ich, wenn ich das richtig sehe noch einige Veränderungen vornehmen, oder?

MfG :D
Jannes

izaseba
24.06.2006, 12:44
naja ich hab es genau andersrum, also PB - widerstand - LED - VCC
wegen dem blödem Resetpin, denn kann man nicht als ganz normalen Ausgang nutzen.

Mal sehen, wenn ich naher mal Zeit und Lust habe kann ich das Programm auf Tn13 abändern, und den Reset erstmal weglassen.
Mit welcher Frequenz arbeitet der tn13 normallerweise?(Sorry hab gerade kein Dattenblatt zur Hand).

Gruß Sebastian

Hanni
24.06.2006, 13:06
Von Werk aus mit 9.6 MHz und interner 1/8 Takt Teilung ausgeliefert.

Also im Lieferzustand mit 1.2 MHz

Grüße,

da Hanni.

Jannes M-Sp
24.06.2006, 13:07
Da sieht man wieder meine Unwissenheit...
Also in den Scripts, die ich in Bascom habe steht oben $crystal = 1200000

In den Fuses hab ich Folgendes Bild:
http://home.arcor.de/einschwein2/fehler5.jpg
Bisher habe ich es übrigens so gemacht, dass ich in Bascom die Scripts geschrieben habe und dann die HEX mit dem AVR-Studio auf den Tiny programmiert habe...

Wäre echt cool wenn du die Zeit dazu finden würdest, aber ich will hier niemandem etwas aufzwingen! Evtl. bekomme ich dann ja sogar, wenn ich überhaupt irgendwo durchsteige, die Version mit allen Pins hin.

Aber ich habe gerade ein Problem, womit kann ich die Datein öffnen, bei meinem USB-ISP waren nur Bascom, AVR-Studio, WinAVR und AVR Dude bei. Wo bekomme ich das entsprechende Programm?

Grüße
Jannes

izaseba
24.06.2006, 14:07
Also im Lieferzustand mit 1.2 MHz


Danke Hanni, dann wird der Timer ja schon fast passen Tn15 hat 1,6Mhz


Aber ich habe gerade ein Problem, womit kann ich die Datein öffnen

Meinst Du jetzt tar.gz ?
Winzip müßte es an sich kennen, wenn nicht dann werde es bei meiner Frau zipen, kein Problem.

oder meinst Du *.asm ?
Ich denke AVR-Studio oder ein normaler Texteditor ....

Jannes M-Sp
24.06.2006, 14:50
die .gz-Datei habe ich geöffnet bekommen, war kein Problem! Nur die main.asm will AVR-Studio scheinbar nicht öffnen, jedenfalls wird nichts angezeigt.

Die main.asm~ lässt sich aber öffnen wie ich gerade bemerkt habe!

izaseba
24.06.2006, 14:53
Hallo,
Hier eine geänderte Version für den Tiny13,
es waren kleine Änderungen nötig, wie Stackpointer init, da der Tiny 15 Keinen Ram hat, und die Register für Timer 0 haben etwas andere namen.

Ich hab die 6 Led deaktiviert, weil sie ja am Reset hängt guck erstmal ob es so klappt.
Ich hoffe daß das Programm klappt, hab es nicht ausprobieren können, weil ich keinen Tiny 13 hab.



.include "tn13def.inc"

.equ TIMERVALUE = 256 - 30
.equ LEDDDR = DDRB
.equ LEDPORT = PORTB
.equ LED1 = PB0
.equ LED2 = PB1
.equ LED3 = PB2
.equ LED4 = PB3
.equ LED5 = PB4
.equ LED6 = DDB5

.def sregsav = R1
.def time1 = R2
.def time2 = R3
.def time3 = R4
.def time4 = R5
.def time5 = R6
.def time6 = R7
.def schritt1 = R8
.def schritt2 = R9
.def schritt3 = R10
.def schritt4 = R11
.def schritt5 = R12
.def schritt6 = R13

.def tmp1 = R16
.def tmp2 = R17
.def tmp3 = R18
.def tmpi1 = R19


.org 0x0000
rjmp reset
.org TIM0_OVF0addr
rjmp timer5ms
reset:
ldi tmp1,RAMEND
out SPL,tmp1
ldi tmp1,(1<<LED1)|(1<<LED2)|(1<<LED3)|(1<<LED4)|(1<<LED5)
out LEDDDR,tmp1

;; Timer 0
ldi tmp1,(1<<CS02)
out TCCR0B,tmp1
ldi tmp1,(1<<TOIE0)
out TIMSK0,tmp1
ldi tmp1,TIMERVALUE
out TCNT0,tmp1
sei

ldi tmp3,1
clr tmp2
clr schritt1
clr schritt2
clr schritt3
clr schritt4
clr schritt5
clr schritt6



loop:
tst time1
brne loop_1
rjmp led1update
loop_1:
tst time2
brne loop_2
rjmp led2update
loop_2:
tst time3
brne loop_3
rjmp led3update
loop_3:
tst time4
brne loop_4
rjmp led4update
loop_4:
tst time5
brne loop_5
rjmp led5update
loop_5:
tst time6
brne loop
; rjmp led6update RESET erstmal weg
rjmp loop

led1update:
ldi ZH,HIGH(timesled1*2)
ldi ZL,LOW(timesled1*2)
add ZL,schritt1
adc ZH,tmp2
lpm
cp R0,tmp2
breq led1update1
sbi LEDPORT,LED1
rjmp led1update2
led1update1:
cbi LEDPORT,LED1
led1update2:
add ZL,tmp3
adc ZH,tmp2
lpm
mov time1,R0
inc schritt1
inc schritt1
ldi tmp1,8
cp schritt1,tmp1
brlo loop
clr schritt1
rjmp loop

led2update:
ldi ZH,HIGH(timesled2*2)
ldi ZL,LOW(timesled2*2)
add ZL,schritt2
adc ZH,tmp2
lpm
cp R0,tmp2
breq led2update1
sbi LEDPORT,LED2
rjmp led2update2
led2update1:
cbi LEDPORT,LED2
led2update2:
add ZL,tmp3
adc ZH,tmp2
lpm
mov time2,R0
inc schritt2
inc schritt2
ldi tmp1,4
cp schritt2,tmp1
brlo loop
clr schritt2
rjmp loop

led3update:
ldi ZH,HIGH(timesled3*2)
ldi ZL,LOW(timesled3*2)
add ZL,schritt3
adc ZH,tmp2
lpm
cp R0,tmp2
breq led3update1
sbi LEDPORT,LED3
rjmp led3update2
led3update1:
cbi LEDPORT,LED3
led3update2:
add ZL,tmp3
adc ZH,tmp2
lpm
mov time3,R0
inc schritt3
inc schritt3
ldi tmp1,4
cp schritt3,tmp1
brlo led3update3
clr schritt3
led3update3:
rjmp loop

led4update:
ldi ZH,HIGH(timesled4*2)
ldi ZL,LOW(timesled4*2)
add ZL,schritt4
adc ZH,tmp2
lpm
cp R0,tmp2
breq led4update1
sbi LEDPORT,LED4
rjmp led4update2
led4update1:
cbi LEDPORT,LED4
led4update2:
add ZL,tmp3
adc ZH,tmp2
lpm
mov time4,R0
inc schritt4
inc schritt4
ldi tmp1,14
cp schritt4,tmp1
brlo led4update3
clr schritt4
led4update3:
rjmp loop

led5update:
ldi ZH,HIGH(timesled5*2)
ldi ZL,LOW(timesled5*2)
add ZL,schritt5
adc ZH,tmp2
lpm
cp R0,tmp2
breq led5update1
sbi LEDPORT,LED5
rjmp led5update2
led5update1:
cbi LEDPORT,LED5
led5update2:
add ZL,tmp3
adc ZH,tmp2
lpm
mov time5,R0
inc schritt5
inc schritt5
ldi tmp1,14
cp schritt5,tmp1
brlo led5update3
clr schritt5
led5update3:
rjmp loop

led6update:
ldi ZH,HIGH(timesled6*2)
ldi ZL,LOW(timesled6*2)
add ZL,schritt6
adc ZH,tmp2
lpm
cp R0,tmp2
breq led6update1
cbi DDRB,LED6
rjmp led6update2
led6update1:
sbi DDRB,LED6
led6update2:
add ZL,tmp3
adc ZH,tmp2
lpm
mov time6,R0
inc schritt6
inc schritt6
ldi tmp1,14
cp schritt6,tmp1
brlo led6update3
clr schritt6
led6update3:
rjmp loop

timer5ms:
in sregsav,SREG
clr tmpi1
cpse time1,tmpi1
dec time1
cpse time2,tmpi1
dec time2
cpse time3,tmpi1
dec time3
cpse time4,tmpi1
dec time4
cpse time5,tmpi1
dec time5
cpse time6,tmpi1
dec time6
ldi tmpi1,TIMERVALUE
out TCNT0,tmpi1
out SREG,sregsav
reti


timesled1:
.db 0,10,1,10,0,10,1,100

timesled2:
.db 0,10,1,100

timesled3:
.db 0,100,1,100

timesled4:
.db 1,100,0,7,1,7,1,7,1,7,1,7,1,7

timesled5:
.db 1,100,1,7,1,7,0,7,1,7,1,7,1,7

timesled6:
.db 1,100,1,7,1,7,1,7,1,7,0,7,1,7


Wenn es zu langsamm oder zu schnell blinkt mußt Du TIMERVALUE anpassen.

Gruß Sebastian

EDIT: beim Anhang oben hab ich irgendwas verbockt, habe es gerade geändert
Ich habe leider keine oder wenig Komentare drin, wenn erwünscht kann ich das nachholen...

Jannes M-Sp
24.06.2006, 16:01
ok, vielen dank! Ich hab nur noch ein Problem, bisher habe ich immer eine fertige HEX-Datei raufgespielt, wie mache ich es nún in AVR Studio?

Hanni
24.06.2006, 16:11
1. Neues Projekt erstellen
2. den oben geposteten Quelltext via Copy & Paste einfügen
3. speichern
4. Build anklicken
5. das resultierende Hex, welches sich nun im Projektverzeichniss befinden sollte in den Tiny flashen.


Grüße,

Hanni.

Jannes M-Sp
24.06.2006, 16:57
Ok, Hab da jetzt ein paar Fehler drin:
http://home.arcor.de/einschwein2/fehler6.jpg

izaseba
24.06.2006, 17:32
Guck Dir das Spiel an und lass den tiny in ruhe O:)

zu fehler 1 -> lösche das "i" in der neunten Zeile (weiß nicht wie sich das in dem Code eingeschlichen hat 8-[ )

zu fehler 2 -> hmmm in meinem tn13def.inc heißt der Vektor so :-k


.equ TIM0_OVF0addr =$003 ;Overflow0 Interrupt


Entweder guckst Du in deinem tn13def.inc was die da geändert haben, oder
schreibst Du in Zeile 35


.org 0x003

damit dürfte auch der Fehler 3 weg sein

Gruß Sebastian

P.S. Jetzt weiter Fußball

Jannes M-Sp
24.06.2006, 18:49
Vermutlich habe ich nur "verschlimmbessert".
http://home.arcor.de/einschwein2/fehler7.jpg

Hm, irgendwie habe ich 2 verschiedene tn13def.inc
http://home.arcor.de/einschwein2/tn13def.inc.rar


PS: War doch ein schönes Spiel, auch wenn es trotz der vielen Chancen gegen Ende fast schon langweilig wurde.

izaseba
24.06.2006, 19:28
So, ist doch eine schwere Geburt...
In der ersten tn13...... fehlen komischerweise die PB* Zuweisungen
und bei der zweiten regnet es bei meinem Assembler Fehler wegen
#pragma #ifndef usw. hört sich irgendwie nach C an wobei #pragma kommt glaub ich bei Keil Kompiler vor, komisch aber egal.

Anbei tn13def.inc von avrstudio 3.blabla (das einzigste, das sich auf meinem Linux Rechner zum Funktionieren bereit erklärt hat)
main.asm (diesmal ohne Fehler) und mein.hex

Leider kann ich Dir bei AVR Studio nicht viel helfen, da ich alles in der Konsole entwickle und programmiere.

Guck mal damit.

Gruß Sebastian

Jannes M-Sp
24.06.2006, 23:58
Vielen Dank! Hab die HEX jetzt auf den Tiny gespielt, aber ich habe leider noch kein neues Testboard. Das ist doch jetzt die version wo der Reset-Pin frei belbt oder?

izaseba
25.06.2006, 00:28
ja ich hab den resetpin weggelassen, programmtechnisch kann man sowieso nichts verstellen, ich weiß nur nicht, was da passiert, wenn man im Programm daran "wackelt" .
Klappt es denn? es müßte ja andersherum gehen also nicht aufblinken, sondern ausgehen ...
Das kannst Du auch selber verändern indem Du ganz am Ende vom Programm in den Zeilen
.db ..........

aus Nullen einser machst und umgekehrt.

Gute Nacht

Jannes M-Sp
25.06.2006, 10:32
ok, es blinkt ganz hervorragend! Ich werde jetzt erstmal versuchen 0 und 1 zu vertauschen, und dann mal sehen ob ich den Reset mit belegt bekomme. Kann ich das von der main.asm, die du für den Tiny 15 geschrieben hast abgucken?

MfG
Jannes

Edit:
Kurzer Test:

timesled4:
.db 1,100,0,7,1,7,1,7,1,7,1,7,1,7
...wird zu...
timesled4:
.db 0,011,1,7,0,7,0,7,0,7,0,7,0,7
?

izaseba
25.06.2006, 13:54
Hallo, das ist nicht ganz richtig,

Kurze Erklärung:

alle 5 mS wird ein Timeroverflow Interrupt ausgelöst und es wird ein Register um eins dekrementiert.

Wenn der Wert auf Null ist wird der Ernsprechende Ausgang umgeschaltet.

in den Zeilen .db ....... sind die Werte gespeichert und zwar:

.db 1,100,0,7,1,7,1,7,1,7,1,7,1,7

1.
1, Heißt ausgang auf HIGH
2.
mit 100 wird der Register geladen, der alle 5 mS dekrementiert wird (insgesammt 500mS) den Wert mußt Du so stehen lassen...
3. 0 wiederum Ausgang auf LOW
4. 35 mS warten ( 7*5)
5. 0 Ausgang LOW
usw.

Du mußt also jede Zweite Zeile ändern, klar ?

Gruß Sebastian

Jannes M-Sp
25.06.2006, 14:49
Jetzt bockt mein AVR Studio wieder...
http://home.arcor.de/einschwein2/fehler8.jpg

Aber jetzt hab ich immerhin durchschaut wie man die Blinkfolge regelt! Demnach müsste der zu ändernde Teil wie folgt aussehen:

timesled1:
.db 1,10,0,10,1,10,0,100

timesled2:
.db 1,10,0,100

timesled3:
.db 1,100,0,100

timesled4:
.db 0,100,1,7,0,7,0,7,0,7,0,7,0,7

timesled5:
.db 0,100,0,7,0,7,1,7,0,7,0,7,0,7

timesled6:
.db 0,100,0,7,0,7,0,7,0,7,1,7,0,7

Hm, meint ihr wir bekommen mein AVR-Studio noch geradegebogen?

Grüße
Jannes

izaseba
25.06.2006, 15:50
Du hast meine Post von Gestern nicht richtig gelesen [-X

Kleine Assemblerkonde :-)

in meiner tn13def.inc steht drin:


.equ TIM0_OVF0addr =$003 ;Overflow0 Interrupt


Das heißt nichts anderes als Bacics

Allias TIM0_OVFaddr $003

ich hoffe das es richtig ist...... :-)

AvrStudio meckert das TIM0_OVFaddr nicht definiert ist.
Irgendwie ist die Bezeichnung zwischen meinem tn13.. und Deinem anders.
ABER, wenn Du die Zeile 35 löschst und

.org 0x003

hinschreibst dürfte sich das Problem erledigt haben.

Probier mal.

Gruß Sebastian

Jannes M-Sp
25.06.2006, 17:01
Fehler gefunden!
Hatte im Hintergrund ein Projekt laufen, in dem das nicht geändert war und somit wollte er immer das Falsche assemblieren.
Aber es läuft und sieht echt cool aus. Vielen Dank soweit!

Nun frage ich mich noch wie ich den Resetpin auchnoch belege, da sind ja auch noch einige technische Veänderungen an meinem Testboard nötig, oder?

MfG
Jannes

izaseba
25.06.2006, 17:28
da sind ja auch noch einige technische Veänderungen an meinem Testboard nötig, oder?

Naja, es stellt sich nur die Frage, ob es ein TESTboard ist, oder die endgültige Version.
Ich hab mir kurz das Dattenblatt zu Tiny13 angeschaut, nur so richtig schlau werde ich daraus nicht.
Bei Tiny 15 kann man den Reset nicht als vollwertigen I/O Pin benutzen sondern als Openkolektor Ausgang.
Das heißt der kann keine VCC ausgeben sondern nur LOW oder halt hochohmig und man kann nicht mehr als 15 mA glaub ich darüber abführen.
Das war auch u.a. ein Grund warum ich die Dioden gegen VCC geschaltet habe (also genau andersherum als Du) und Low-Curent LED zum Einsatz kamen.
Da in der tn13def.inc PB5 nicht definiert ist, läßt es mich vermuten, daß es bei Deinem Tiny genauso ist, ich lass mich aber gerne vom Gegenteil überzeugen.
Du könntest Deine Schaltung so abändern, daß die LED's auch an VCC hängen(das Programm natürlich auch) oder so belassen und einen Transistor als Treiber für die LED am Reset mit einem Pullup Widerstand schalten.

Am sonsten heißt es probieren geht über studieren...
Die Tinys, mit wegprogrammiertem Reset kannst Du dann gerne an mich schicken ich mach mir die wieder fit :-)

Gruß Sebastian

Jannes M-Sp
25.06.2006, 18:11
Das geht? Die kann man widerbeleben?

Naja, was genau muss ich an deinem Script ändern, damit auch PB5 die 15mA abführt? Ich könnte mir fast vorstellen, das ich trotz 20mA LEDs mit 15 mA auskomme, da es ja nur für 1/35s aufleuchtet.

Grüße
Jannes

izaseba
25.06.2006, 19:36
Das geht? Die kann man widerbeleben?

Was meinst Du, STK 500 muß ja für irgendwas gut sein, oder?
Aber im ernst, das magische Wort heißt "Serial High-Voltage Programming"
hört sich gefährlich an, aber damit kannst Du die Fuses komplett zurücksetzen.

Je mehr ich mir das Dattenblatt von Tiny13 angucke, umso mehr verstehe ich die Verwendung von PB5 nicht.

Es steht drin, daß man es alternativ zu Reset als Debug Wire I/O,ADC Input Chanel oder Pin Change Interrupt verwenden kann.

Es steht aber nichts davon, daß es als normaler I/O verwendet werden kann
:-k .
Als weiteres habe ich rausgelesen warum in Deinem tn13def.inc kein PB* definiert war, sie heißen da alle PORTB* ](*,)
Und sehe da es gibt einen PORTB5 .
Jetzt stellt sich ja nur die Frage kann ich ihn jetzt als normalen I/O mit
sbi DDRB,PORTB5 als Ausgang konfigurieren, und vor allen ob dann
sbi (cbi) PORTB,PORTB5 an Ihm wackelt :-k :-k :-k

So viele Fragen, und kein Tiny13 in der Bastelkiste um das auszuprobieren.
Vielleicht gibt es hier jemanden sonst noch im Forum, der das mitliest und eine klare Antwort geben kann :-k

Gruß
ein unsicherer Sebastian

Jannes M-Sp
25.06.2006, 21:18
Ich frag mal in meinem Modellbauforum nach, die haben mir immerhin schon Step-by-step den ISP zum Laufen gebracht!

izaseba
25.06.2006, 21:50
Tue das, wenn es da auch keinen gibt, der genau sagen kann, ja den kann man als einen normalen I/O Port werwenden dann hilft nur noch eins:ausprobieren.

Einfach nur ein "unwichtiges" Blinkprogramm auf den Reset legen und ausprobieren, wenn es nicht geklappt hat dann hast Du Blinker mit fünf LED's
oder aber ich einen Tiny13 =P~
Gruß Sebastian

Jannes M-Sp
26.06.2006, 14:44
So, hab im RCL-Forum eine Antwort bekommen. Mir hilft sie zwar noch recht wenig, aber evtl. kannst du ja eine brauchbare Info entnehmen:


PB5 benutzt Du im Programm genau wie die anderen Ports.

Um dan Pin aber wirklich für die ein/Ausgabe nutzbar zu machen, musst Du die Fuse RSTDISBL (Reset Disabled (Enable PB5 as i/o pin)) auf 1 schießen.

Grüße
Jannes

izaseba
26.06.2006, 18:25
so, auf Grund der Aussage aus dem anderem Forum hab ich den PB5 so behandelt, wie jeden anderen Pin auch.
Im Anhang findest Du mein Code, allerdings mußt Du noch die .db Zeilen und die .org Zeile anpassen (hab ich glatt vergessen zu machen ](*,) ).
Probiere das Programm erst aus, eventuell die Zeiten also TIMERVALUE = 256-30 ändern, damit es schneller, bzw. langsammer blinkt (wenn 30 erniedrigt wird blinkt es schneller) und wenn alles i.O. ist kannst Du den Fuse verstellen.
Im AvrStudio auf Fuses gehen zuerst lesen drücken, dann den RSTDISB Bit ändern, schreiben, Warnung bestätigen, und freuen(oder auch nicht) :-)
Aber bedenke, zuerst das Programm flashen, dann Fuses umstellen.
Außerdem wenn es schief läuft möchte ich dafür nicht verantwortlich gemacht werden !

Berichte mal, was es gegeben hat

Gruß Sebastian :wink:

EDIT: es kann auch sein, daß Du Dich im dauerreset befindet, wenn Du den Fuse noch nicht verändert hast :-k

Jannes M-Sp
26.06.2006, 22:54
Komme gerade erst nach hause, werde versuchen es morgen mal zu Probieren. Natürlich mache ich dich für Fehlfunktionen nicht verantwortlich, ein bissel Schwund ist halt immer dabei. Wäre nur schade wenn ich erst neu bestellen muss.

Gute Nacht!
MfG Jannes

Jannes M-Sp
01.07.2006, 16:29
Hm, also beim ersten Mal hat es jetzt nicht geklappt, PinB5 stellt sich tot. Es könnte auch sein, dass ich einen Fehler gemacht habe, das muss ich jetzt nochmal gegenchecken.

MfG
Jannes

Jannes M-Sp
07.07.2006, 12:14
hm, hab da jetzt noch ne Sache, erst dachte ich ich guck nicht richtig, aber ich hab es jetzt eben wieder Beobachtet und es ist kein Kamerafehler: Die eine LED behält ihre Blinkfrequenz nicht bei, sondern hat Aussetzer. Woran kann das liegen? Beobachtet hab ich das erst nach dem ich das RSTDISB Bit umgestellt habe.


Wer will kann gerne mal einen Blick drauf werfen, ich hab das ganze auf Video. Aber Achtung, 12mb!
http://home.arcor.de/einschwein2/R0010179.AVI

MfG
Jannes

...endlich Ferien!

Jannes M-Sp
11.07.2006, 22:12
Keiner mehr da?

Jannes M-Sp
27.10.2006, 08:37
Ist meine Frage zu schwer oder zu doof 8-[