Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »exelero« (14. Februar 2010, 19:07)
|
|
Quellcode |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
$regfile "attiny13.dat" $crystal = 9600000 'Interner Oszillator ohne Teiler Config Pinb.0 = Input 'Anschluss am Empfäner b.0 Dim Signal As Byte 'Länge des Signals vom Empfänger Config Portb.1 = Output 'Schaltausgang Do Pulsein Signal , Pinb , 0 , 1 'Signallänge an Pinb.0 abfragen If Signal < 70 Then 'wenn linker Anschlag --> Ausgang ausschalten Portb.1 = 0 End If If Signal > 130 Then 'wenn rechter Anschlag --> Ausgang anschalten Portb.1 = 1 End If Loop 'von Vorne anfangen |
Wenn der Grundcode erstmal steht bekomme ich das hin (einfach mit waitms).
Zitat
Oder soll das Blinken der Leds auch vom µC übernommen werden, denn mit dem Code wird der Ausgang nur ein- und ausgeschaltet.
Danke für den Code =) mal gucken ob es mit den Werten funktioniert.Die Werte die Pulsein liefert hängen leider auch der Taktfrequenz ab, deswegen kann ich nicht garantieren, dass es mit diesen Werten funktioniert.
Zur Not müsste man dort einfach die Werte noch verändern.
Der Tiny13 hat nur 64 Byte SRAM.Dim Signal As Word = Out of SRAM space, in file G:\ ...
Pulsein Signal , Pinb , 0 , 1 = Assignment error [SIGNAL: 0 __WTMPC: 36] , in file G:\
und LOOP expected , in File :
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »BehindBlueEyes« (12. März 2010, 22:32)
.
)
|
|
Quellcode |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
$regfile = "attiny2313.dat"
$crystal = 9600000 'Interner Oszillator ohne Teiler
Config Pinb.0 = Input 'Anschluss am Empfäner b.0
Config Portd = Output 'Schaltausgang PinD.6 Strobe | PinD.5 Beaconlight
Dim Signal As Byte 'Länge des Signals vom Empfänger
Dim X As Byte 'Hilfvariable wegen Federbelastung des "Knüppels"
X = 0
Pinb.0 = 0
Pind.5 = 0
Pind.6 = 0
Strobe Alias Pind.6
Beacon Alias Pind.5
Do
Pulsein Signal , Pinb , 0 , 1 'Signallänge an Pinb.0 abfragen
If Signal < 70 Then 'wenn linker Anschlag --> nur Strobelight
Do
Strobe = 1
Waitms 20
Strobe = 0
Waitms 20
Strobe = 1
Waitms 20
Strobe = 0
Waitms 1300
Incr X
Loop Until X = 60
Elseif Signal > 130 Then 'wenn rechter Anschlag --> Strobe und Beacon
Do
Strobe = 1
Waitms 20
Strobe = 0
Waitms 40
Strobe = 1
Waitms 20
Strobe = 0
Waitms 650
Beacon = 1
Waitms 300
Beacon = 0
Waitms 200
Incr X
Loop Until X = 60
End If
Loop
End
|
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »exelero« (21. Januar 2010, 21:16)
Jap PB7 ist SCK..
Zitat
edit: ist der UCSK Pin der "für mich" alte SCK Pin? also der für ISP (MOSI,MISO,REST,SCK)
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Jakob« (21. Januar 2010, 21:30)
Nur *falls* es doch mal Platzprobleme gibt: Tiny25/45/85 ist auch nicht größer als Tiny13, hat aber 128 bzw. 256 bzw. 512 Byte RAM...hmm dann schmeiß ich den Code eben auf einen tiny2313 - so große Platzprobleme habe ich dann doch nicht.


Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »Pesi« (21. Januar 2010, 22:41)
. Ich find die Ideen auch alle super aber um ehrlich zu sein war ich schon froh das ich den Code hinbekommen habe...
) ich habe das nur vom Code von samotronta05 übernomen. Außerdem ist mir gerade noch aufgefallen das X = 0 aus Zeile 13 in die Do-loop schleife gehört - also Zeile 23.Mit der Software hätte wären dann ja alle Möglichkeiten ausgereitzt
Zitat
Nochmal EDIT: natürlich könnte man das auch einfach durchschalten: bei jedem Knüppeldruck nach rechts das "Programm" eins weiter, also Aus - Strobe - Strobe+Beacon - wieder aus - dann könnte man mit Knüppel nach links noch andere Sachen (z.B. Landescheinwerfer) *unabhängig davon* steuern, Pins sind ja noch frei am Tiny...
.
)
)

|
|
Quellcode |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
$regfile = "attiny2313.dat" $crystal = 8000000 'Interner Oszillator/Quarz Config Pinb.0 = Input 'Anschluss am Empfänger b.0 Config Portd.6 = Output 'Schaltausgang PinD.6 Strobe Config Portd.5 = Output 'Schaltausgang PinD.5 Beaconlight Config Portb.0 = Output 'Schaltausgang 2 Dim Signal As Byte 'Länge des Signals vom Empfänger Dim Modus As Byte '0=Aus 1=Strobe 2=Strobe+Beacon Dim Schalt2 As Bit 'Status Schaltausgang 2 Schalt2 = 0 Dim Zaehler As Word 'Zähler für Strobe/Beacon Zeitsteuerung Config Timer0 = Timer , Prescale = 1024 'timer0 konfigurieren On Timer0 Isr_timer0 'immer zu isr_timer0 springen Enable Timer0 'timer0 einschalten Enable Interrupts 'Interrupts global einschalten Do Pulsein Signal , Pinb , 0 , 1 'Signallänge an Pinb.0 abfragen If Signal > 85 Then 'nur weitermachen wenn brauchbares Signal If Signal < 115 Then 'wenn linker Anschlag --> Ausgang2 ein/ausschalten If Schalt2 = 0 Then 'wenn aus dann einschalten Schalt2 = 1 Portb.0 = 1 Else 'sonst ausschalten Schalt2 = 0 Portb.0 = 0 End If Waitms 300 'entprellen End If If Signal > 170 Then 'wenn rechter Anschlag --> Strobe/Beacon anschalten If Modus = 0 Then 'wenn aus Strobe einschalten, Modus 1 Modus = 1 Elseif Modus = 1 Then 'wenn Strobe breits an Beacon auch noch anschalten, Modus2 Modus = 2 Else 'sonst bzw wenn Beacon+Strobe bereits an alles ausschalten Modus = 0 Zaehler = 0 Portd.6 = 0 Portd.5 = 0 End If Waitms 300 'entprellen End If End If Loop 'von Vorne anfangen Isr_timer0: 'wird alle 20ms ausgeführt Select Case Zaehler: Case 1 : Portd.6 = 1 'nach 20ms Strobe an Case 2 : Portd.6 = 0 'nach 40ms Strobe aus Case 4 : Portd.6 = 1 'nach 80ms Strobe an Case 5 : Portd.6 = 0 'nach 100ms Strobe aus Case 37 : If Modus = 2 Then Portd.5 = 1 'nach 740ms wenn Modus2(Beacon) Beacon an Case 42 : Portd.5 = 0 'nach 840ms beacon aus Case 52 : Zaehler = 0 'nach 1040ms von Vorne beginnen End Select If Modus > 0 Then ' nur wenn Strobe/Beacon an ist hochzählen Incr Zaehler End If Timer0 = 100 'Timer zurücksetzen Return 'zurückkehren |
Zitat
der interne RC-Oszi ohne Teiler ist aber doch 8 MHz und nicht 9,6...?!?

Dieser Beitrag wurde bereits 7 mal editiert, zuletzt von »samotronta05« (23. Januar 2010, 03:12)
Ja alles Super verständlich und gut kommentiert. ABER: Da ich in Berufsschule damals das mit den Interrupts und Timern an mir vorbeifliegen lasse habe (damn itIch hoffe der Code ist so verständlich und übersichtlich.
Fragen?, Fragen!
|
|
Quellcode |
1 2 3 |
$crystal = 8000000 Config Timer0 = Timer , Prescale = 1024 On Timer0 Isr_timer0 |
|
|
Quellcode |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
Isr_timer0: 'wird alle 20ms ausgeführt Select Case Zaehler: Case 1 : Portd.6 = 1 'nach 20ms Strobe an Case 2 : Portd.6 = 0 'nach 40ms Strobe aus Case 4 : Portd.6 = 1 'nach 80ms Strobe an Case 5 : Portd.6 = 0 'nach 100ms Strobe aus Case 37 : If Modus = 2 Then Portd.5 = 1 'nach 740ms wenn Modus2(Beacon) Beacon an Case 42 : Portd.5 = 0 'nach 840ms beacon aus Case 52 : Zaehler = 0 'nach 1040ms von Vorne beginnen End Select If Modus > 0 Then ' nur wenn Strobe/Beacon an ist hochzählen Incr Zaehler End If Timer0 = 100 'Timer zurücksetzen Return 'zurückkehren |
(Mit Cam
) Ja alles Super verständlich und gut kommentiert. ABER: Da ich in Berufsschule damals das mit den Interrupts und Timern an mir vorbeifliegen lasse habe (damn itIch hoffe der Code ist so verständlich und übersichtlich.
Fragen?, Fragen!
) hab ich noch n paar Fragen.
![]()
Quellcode
1 2 3 $crystal = 8000000 Config Timer0 = Timer , Prescale = 1024 On Timer0 Isr_timer0
Durch den Prescaler werden die 8000000Hz ja durch 1024 geteilt (= 7812,5 Hz)
Der Timer0 läuft nach 256 ja wieder über also 7812,5 Hz / 256 = 30,517578125 Hz.
Wird durch On Timer0 Isr_timer0 der Interrupt immer ausgelöst wenn der Timer0 einmal durchgelaufen ist? Und das passiert ja 30 mal in der Sekunde also alle 33 Millisekunden.
Wenn das alles so richtig sein sollte: Warum wird der Isr_timer0 dann immer alle 20ms ausgeführt?
Hier verstehe ich noch nicht ganz warum das Stobe angeht wenn der Interrupt das erste Mal ausgelöst wird. Die Variable Zaehler ist ja noch 0 aber der tiefste Case fängt erst bei 1 an. Oder ist "der" dann so "schlau" das der quasi mit case else aus der Schleife springt und bei der If Modus > 0 Then weitermacht?
Und warum wird der timer auf 100 gesetzt anstatt auf 0 ?
Das Video bekommt ihr aber noch.1. Wow! Bei soviel Fachwissen frage ich mich warum du nur so wenige Beiträge bisher geschrieben hast.
Gerade weil du in Texten sehr verständlich erklären kannst.
2. Warum ist die Division 156 / 7812,5 = 0,019968 ? Auf der Seite wo ich mich in das
Timer-ding eingelesen hatte steht es Sinngemäß anders: 7812,5 / 156 = 50,080
3. An welchem Pin wird der zweite Kanal geschaltet?
Config Pinb.0 = Input 'Anschluss am Empfänger b.0
Config Portb.0 = Output 'Schaltausgang 2
Ist Pinb.0 und Portb.0 nicht das selbe?
Ich habe mal einen Schaltplan fertig gemacht.
Findet dort jemand etwas was mach besser machen kann(Größen der Widerstände,Kapazitäten)?
Achja ich war heute nicht fliegen. Auch wenn der Wind relativ schwach war wollt ich nicht mein Glück testen.Das Video bekommt ihr aber noch.
|
|
Quellcode |
1 2 3 4 5 6 7 8 |
Prescaler Reload 4 25536 8 45536 16 55536 32 60536 64 63036 128 64286 258 64911 |
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »dgoersch« (24. Januar 2010, 22:54)
- *ist* doch so konfiguriert:
![]()
Quellcode
1 Isr_timer0: 'wird alle 20ms ausgeführt

