PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Tiny12-Lauflicht will nicht



Goblin
08.10.2006, 09:37
Hallo!



$regfile = "at12def.dat"
$crystal = 1200000
$tiny
Config Pinb.0 = Output
Config Pinb.1 = Output
Config Pinb.2 = Output
Config Pinb.3 = Output
Config Pinb.4 = Output
Eins:
Portb = 1
Waitms 200
Portb = 2
Waitms 200
Portb = 4
Waitms 200
Portb = 8
Waitms 200
Portb = 16
Waitms 200
Goto Eins


Bringt mir folgendes Ergebnis:

http://video.google.de/videoplay?docid=-8270141342921510491

Ich hab 10x mit Datenblatt meinen Schaltplan kontrolliert und kam zu dem Schluss, dass die Pinne in der richtigen Reihenfolge mit der LED-Zeile verbunden sind. Die linke ist LED1(für Informatiker 0). Die wird auch zuerst eingeschaltet. Aber danach wirds dann komisch. Ist der Fehler nun in der Software oder doch irgendwie in der Hardware?

Ich bin verzweifelt! :)

Goblin
08.10.2006, 14:15
Keiner kann mir helfen? Oder ist die Frage einfach zu blöd?

rolfw20
08.10.2006, 15:19
Hi Goblin,

Dein Prog. sollte so laufen.
Sind die LED´s auch richtig angeschlossen?
Hast Du den Vorwiederstand richtig berechnet?
Kann Dein Prozessor den benötigten Strom treiben?

Das sind die Dinge die mir dazu einfallen.

Gruß
Rolf

Goblin
08.10.2006, 15:45
naja wenn ich



portb = 255


mach, dann leuchten zumindest alle. das ist ja das was mich stutzig macht.

teslanikola
08.10.2006, 15:56
für mich ist der fehler klar: Das Programm macht was es soll nur du hast die LEDs an die Falschen Pins, somit stimmt die reihenfolge der LEDs nicht, Prüfe das nochmla nach

Goblin
08.10.2006, 16:47
ich würde dir ja zustimmen, wenn ich das nicht schon einige male kontrolliert hätte..... aber nen vorschlag zur güte: ich werd mal nen schaltplan von meiner schaltung malen. das hilft meist. aber wenn da dann nen positives ergebnis bei rauskommt müsst ihr weiterrätseln! ;)

gandalf
08.10.2006, 17:46
Hallo!, versuch doch mal den folgenden Code:
Ist nur mal eine Idee, habs nicht getestet.




$regfile = "at12def.dat"
$crystal = 1200000
$tiny
Config Portb.0 = Output 'Port setzt auf Augsgang
Config Portb.1 = Output 'Pin setzt auf Eingang !
Config Portb.2 = Output
Config Portb.3 = Output
Config Portb.4 = Output
Eins:
Portb = 1
Waitms 200
Portb = 2
Waitms 200
Portb = 4
Waitms 200
Portb = 8
Waitms 200
Portb = 16
Waitms 200
Goto Eins


Viel Erfolg Bernd

Goblin
08.10.2006, 17:49
Hi!

Hier der Schaltplan:

http://img406.imageshack.us/img406/9987/schaltplanll3.th.gif (http://img406.imageshack.us/my.php?image=schaltplanll3.gif)

@gandalf:

Nö, kommt das gleiche raus. Schade

HPM
08.10.2006, 17:56
Hi Gobblin,

ich hatte das gleiche Problem, als ich mit meinem ersten Projekt anfing!

Ich hab zwar einen 2313 eingesetzt aber mit etwas Modifikation geht das Prog ja auch für nen Tiny!

Lass dich nicht von der Größe des Listings schocken, mein Lauflicht hat unseren Weihnachtsbaum vorm Haus geschmückt und da wollte ich mehrere Lauflichtvarianten durchlaufen lassen!

Jetzt kommts:



'************************************************* *****************************
'Name : Lauflicht5x.bas
'Purpose : Lauflicht für Weihnachtsbaum
'Version : V0.02
'Compiler : BasCom AVR 1.11.7.4
'
'Hardware (1) LED's bzw. Schaltverstärker
' an PB0 bis PB5
' (2) Schalttaster zur Hand/Auto- Steuerung
' an PD0 und PD1
'
'Chiptyp : AT90S2313
'************************************************* *****************************

$regfile = "2313def.dat" 'AT90S2313
$crystal = 4000000 'Quarz-Frequenz



Config Portb = Output 'PBx als Ausgänge
Config Portd = Input 'PDx als Eingänge

Dim W As Byte 'W= Werte in Lauflicht lesen
Dim I As Byte 'I= Schleife für 1 Durchgang
Dim J As Byte 'J= Vieviel mal Schleife

Dim Z As Byte 'Z= Zählerwert
Z = 1

Dim D As Byte
D = 20 'D= Anzahl der Schleifen

Dim T As Integer 'T= Taktzeit
T = 200

Portb = 63 ' alle Ports EIN
Wait 60 ' 60 sec Vorheizen

Auto:

Do

For J = 1 To D
If Pind.1 = 1 Then
Goto Hand: 'Hand/Auto- Ebene
End If
Restore Vor1
For I = 1 To 5
Read W
Portb = W
Waitms T
Next I
Next J

For J = 1 To D
If Pind.1 = 1 Then
Goto Hand: 'Hand/Auto- Ebene
End If
Restore Rueck1 'Zeiger auf Beginn der Daten setzen
For I = 1 To 5 'Lese nächsten Wert
Read W 'Setze Port
Portb = W
Waitms T
Next I
Next J

For J = 1 To D
If Pind.1 = 1 Then
Goto Hand: 'Hand/Auto- Ebene
End If
Restore Neg1 'Zeiger auf Beginn der Daten setzen
For I = 1 To 5 'Lese nächsten Wert
Read W 'Setze Port
Portb = W
Waitms T
Next I
Next J

For J = 1 To D
If Pind.1 = 1 Then
Goto Hand: 'Hand/Auto- Ebene
End If
Restore Neg2 'Zeiger auf Beginn der Daten setzen
For I = 1 To 5 'Lese nächsten Wert
Read W 'Setze Port
Portb = W
Waitms T
Next I
Next J

For J = 1 To D
If Pind.1 = 1 Then
Goto Hand: 'Hand/Auto- Ebene
End If
Restore Add1 'Zeiger auf Beginn der Daten setzen
For I = 1 To 10 'Lese nächsten Wert
Read W 'Setze Port
Portb = W
Waitms T
Next I
Next J

For J = 1 To D
If Pind.1 = 1 Then
Goto Hand: 'Hand/Auto- Ebene
End If
Restore Wechs1 'Zeiger auf Beginn der Daten setzen
For I = 1 To 12 'Lese nächsten Wert
Read W 'Setze Port
Portb = W
Waitms T
Next I
Next J

For J = 1 To D
If Pind.1 = 1 Then
Goto Hand: 'Hand/Auto- Ebene
End If
Restore Kllauf1 'Zeiger auf Beginn der Daten setzen
For I = 1 To 3 'Lese nächsten Wert
Read W 'Setze Port
Portb = W
Waitms T
Next I
Next J

For J = 1 To D
If Pind.1 = 1 Then
Goto Hand: 'Hand/Auto- Ebene
End If
Restore Ende 'Zeiger auf Beginn der Daten setzen
For I = 1 To 2 'Lese nächsten Wert
Read W 'Setze Port
Portb = W
Wait 1
Next I
Next J

Loop

End




'+++++++++++++++++++++++++++++++++++++++++++
' Daten für verschiedene Lauflichtfunktionen
'+++++++++++++++++++++++++++++++++++++++++++


Vor1:
Data 33 , 34 , 36 , 40 , 48, '6 12345 einzenl vorwärts

Rueck1:
Data 48 , 40 , 36 , 34 , 33, '6 54321 einzeln rückwärts

Neg1:
Data 62 , 61 , 59 , 55 , 47, '6 12345 negiert einzeln

Neg2:
Data 47 , 55 , 59 , 61 , 62, '6 54321 negiert einzeln

Add1:
Data 32 , 33 , 35 , 39 , 47 , 63, '6 12345 addierend
Data 62 , 60 , 56 , 48 , '6 12345 subtrahierend

Wechs1:
Data 32 , 33 , 49 , 51 , 59 , 63, '6 1-15-152-1524-15243
Data 32 , 63 , 32 , 63 , 32 , 63, '6 3xalle

Kllauf1:
Data 37 , 42 , 52, '6 13-24-35

Ende:
Data 31 , 32, '6 12345 im Wechsel



Hand:

If Pind.1 = 0 Then
Goto Auto:
End If

If Pind.0 = 0 Then
Z = Z * 2
End If

If Z > 32 Then
Z = 1
End If

Portb = Z

Wait 1

Goto Hand:





Such Dir halt das Stück raus, welches Du für die einfach Funktion brauchst!
Wenn Du Fragen hast, meld Dich halt noch mal!

P.s.: Cooles Video!!!

Schönes Wochenende noch!

HPM
08.10.2006, 18:11
Ähhh, noch was!

Hab hier noch ein vereinfachtes Listing gefunden, was ich mal in einer XBox verbaut habe!

Hat 8 Kanäle (kannste ja auf 4 reduzieren) und läuft nur vorwärts und rückwärts mit der Random Funktion (also zufällig)



'************************************************* ***********
'Name : X-Box Logo.bas
'Purpose : Beleuchtung Lauflicht um das Logo
'Version : V0.01
'Compiler : BasCom AVR 1.11.7.4
'Hardware : LED's an PB 0-7
'Chip type : AT90S2313
'History
'************************************************* ***********
$regfile = "2313def.dat" 'AT90S2313
$crystal = 4000000
Ddrd = &B1111111 '7 Ausgänge PortD auf Masse


Config Portb = Output 'Pin PB0-7 Ausgang
Dim A As Byte
Dim I As Byte
Dim J As Byte
Dim K As Integer

Do
K = Rnd(15)
For J = 1 To K
Restore Vor
For I = 1 To 8 'Lese nächsten Wert
Read A 'Setze Port
Portb = A
Waitms 80
Next I
Next J
K = Rnd(15)
For J = 1 To K
Restore Rueck
For I = 1 To 8 'Lese nächsten Wert
Read A 'Setze Port
Portb = A
Waitms 80
Next I
Next J

Loop


Vor:
Data 254 , 253 , 251 , 247 , 239 , 223 , 191 , 127, '8 12345678 einzeln

Rueck:
Data 127 , 191 , 223 , 239 , 247 , 251 , 253 , 254 '8 87654321 einzeln


So... mehr hab ich aber jetzt nicht dazu!

Goblin
08.10.2006, 18:40
MMM Sorry, danke für deine Mühe, aber mir gehts weniger um das Lauflicht (was ich in kürzester Zeit auf zig verschiedene Arten proggen könnte), sondern darum dass der Tiny nicht tut, was er soll. Und das sollte er, weil ich das Miniboard nämlich zum Assembler lernen benutzen wollte...

magnetix48
08.10.2006, 19:38
Hallo Goblin,

bin zwar nicht der große Bascom-Spezialist, aber meiner Ansicht nach muss es am Anfang deines Programms nicht Config Pinb.0... sondern Config Portb.0... heißen.

Gruß
Detlef

vajk
08.10.2006, 19:40
Dein Schaltplan sieht vernünftig aus, wenn Du den internen Quarz benutzt - nur R1 mit 1k Pullup für Reset .. wären nicht besser typ. 10k plus ein 100n gegen Masse ... auch sollte der 7805 am Eingang und Ausgang ein C mit 100n gegen Masse haben !! ...
Dann noch die Frage, hast Du im Code die richtige Frequenz eingestellt F_CPU und Compilierst für den richtigen Proz, inkl ProgPony fürs richtige AVRlein ... ....

linux_80
08.10.2006, 20:07
Welche der LEDs gehen denn da jetzt nicht, sind ja nur zwei die nix tun ?
Evtl. kann man mal das Hex-file anschauen, ob bascom da evtl. irgendwelche Einstellungen vornimmt, die dann zu einer anderen Verwendung der Pins hinauslaufen. :-k

linux_80
08.10.2006, 20:16
Da haben wir es schon,
der Tiny 12 hat ja kein SRAM, was ja mit dem $tiny schon angedeutet wird, in der Hilfe steht auch schon, das trotzdem nicht alles läuft.
Und so schauts auch aus, denn die Wait-funktion will etwas auf dem Stack sichern, den es ja nicht gibt !
Evtl. mal eine eigene Warteschleife probieren.

Edit: was ein AVR macht bei Befehlen, die er eingentlich nicht kennt(Push & Pop), weiss ich dann auch nicht !

noch'n Edit:
Was mich im DB wundert, beim Befehl RET steht bei Operation:
PC <- STACK !!
Immerhin gibts RET und RCALL, also muss er mind. 2 Byte Stack haben :-k
Oder wie geht das ohne SRAM ? :-k

€3: DB hilft,
also der Tiny hat einen Hardwarestack, der für 3 Ebenen Platz hat (also 3 RCALLs zB. ineinander), und nur für RCALL und Interrupts verwendet werden kann.

Goblin
26.10.2006, 18:17
grrrml! ich weiss jetzt woran es liegt. eine hauchduenne verbindung zwischen 2 pins. hab ich per durchgangspruefer und lupe entdeckt. jetzt funzt das teil natuerlich wie gewollt.