Mittwoch, 8. Februar 2012, 17:00 UTC+1

Sie sind nicht angemeldet.

  • Anmelden
  • Registrieren

exelero

Junior LedStyler

Beiträge: 151

Wohnort: Hamburg

Beruf: Elektroniker

1

Dienstag, 19. Januar 2010, 20:49

PWM Signal in µC einlesen

Hallo

Ich habe mir vor kurzem ein RC Modellflugzeug gekauft (Skyartec Funjet). Da dieser Flieger über kein Seitenruder
verfügt habe ich mir gedacht man könnte den Kanal zum schalten von Leds benutzten.
Die Leds wären dann als Strobe und Beacon lights an den Flügelspitzen bzw. Rumpfoberseite (nein Unterseite
nicht nun doch) und würden mit unterschiedlichen Frequenzen blinken. Zum Anschalten könnte man den "Knüppel" für das
Seitenruder nach links oder rechts bewegen und zum Ausschalten in die entgegen gesetzte Richtung. Der
"Knüppel" für das Ruder ist allerdings federbelastet und springt nach dem loslassen wieder zurück in neutralposition.

Könnte mir jemand von euch einen Programmcode für Bascom coden (?). Als µC habe ich an den ATtiny13
aufgrund seiner größe gedacht. Die Schaltung sollte möglichs ohne externen Quarz auskommen.
Den Code auf den µC flashen schaffe ich noch alleine aber fürs Programmieren fehlen mir die grauen Zellen :wacko: ^^

Gruß

edit = rot

Danke! Problem erledigt! Schaltung funktioniert!

Software: PWM Signal in µC einlesen

Schaltung und Layout: PWM Signal in µC einlesen


Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »exelero« (14. Februar 2010, 19:07)

  • Zum Seitenanfang

samotronta05

Senior LedStyler

Beiträge: 289

Wohnort: 500 km geradeaus, dann links

2

Dienstag, 19. Januar 2010, 22:04

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

Das wäre so die einfachste Möglichkeit das Signal auszuwerten.
Oder soll das Blinken der Leds auch vom µC übernommen werden, denn mit dem Code wird der Ausgang nur ein- und ausgeschaltet.
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.
  • Zum Seitenanfang

exelero

Junior LedStyler

Beiträge: 151

Wohnort: Hamburg

Beruf: Elektroniker

3

Donnerstag, 21. Januar 2010, 18:54

Zitat

Oder soll das Blinken der Leds auch vom µC übernommen werden, denn mit dem Code wird der Ausgang nur ein- und ausgeschaltet.
Wenn der Grundcode erstmal steht bekomme ich das hin (einfach mit waitms).
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.
Danke für den Code =) mal gucken ob es mit den Werten funktioniert.
Als ich den Code in Bascom eingefügt habe um zu kompilieren versuchte kam folgende Fehlercodes:

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 :

ich habe mir nochmal die version von mcselec.com heruntergeladen. allerdings mit den selben fehlern
meine version ist

Compiler version :1.11.9.8
Compiler build :1.11.9.8.001
IDE version :1.11.9.8
Serial number Serial DEMO

Es wird wahrscheinlich nur ein kleiner Fehler sein der das ausmacht.

gruß
  • Zum Seitenanfang

BehindBlueEyes

LedStyles Newbie

Beiträge: 9

Wohnort: Marktheidenfeld

4

Donnerstag, 21. Januar 2010, 19:25

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 :

Der Tiny13 hat nur 64 Byte SRAM.
Schau mal unter Options->Compiler->Chip. Dort sind Werte für HW Stack, Soft Stack und Framesize eingetragen. Die sind zusammen wohl schon größer als 64. Die Summe muss kleiner 63 sein, damit du deine Word Variable noch hinzufügen kannst.
Alternativ kannst du im Code auch
$TINY
angeben, dann werden die Stacks nicht benutzt.
Der Rest sind bestimmt Folgefehler.

BEye

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »BehindBlueEyes« (12. März 2010, 22:32)

  • Zum Seitenanfang

exelero

Junior LedStyler

Beiträge: 151

Wohnort: Hamburg

Beruf: Elektroniker

5

Donnerstag, 21. Januar 2010, 20:33

Ach okey..
hmm dann schmeiß ich den Code eben auf einen tiny2313 - so große Platzprobleme habe ich dann doch nicht :D .
Empfiehlt es sich ein Quarz zu benutzen?
Ich passe den Code bis morgen an (wäre cool wenn ihr dann nochmal rübergucken könntest ;) )

gruß

edit: ist der UCSK Pin der "für mich" alte SCK Pin? also der für ISP (MOSI,MISO,REST,SCK)




edit2: So doch noch heute :D

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)

  • Zum Seitenanfang

Jakob

Senior LedStyler

Beiträge: 214

Wohnort: Buxtehude

Beruf: Konstruktionsmechaniker Ausbildung

6

Donnerstag, 21. Januar 2010, 21:14

Zitat

edit: ist der UCSK Pin der "für mich" alte SCK Pin? also der für ISP (MOSI,MISO,REST,SCK)
Jap PB7 ist SCK..

Grüße Jakob

EDIT: Ja, das sieht doch gut aus, nur wird das Programm erst nach einem kompletten Durchlauf aufhören, aber das dürfte ja eigentlich nicht soo schlimm sein oder ?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Jakob« (21. Januar 2010, 21:30)

  • Zum Seitenanfang

Pesi

Golden LedStyler

Beiträge: 6 315

Wohnort: Home of the Pope

Beruf: Mischling

7

Donnerstag, 21. Januar 2010, 22:24

hmm dann schmeiß ich den Code eben auf einen tiny2313 - so große Platzprobleme habe ich dann doch nicht :D .
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... ;)

EDIT: Und das ist ja nun doch anders als ursprünglich geplant..? - also jetzt eine Seite Strobe, andere Strobe+Beacon, wird gestartet und läuft dann 60 mal durch..?

Du könntest das ja auch so machen: bei Knüppel rechts machst Du Strobe - das läuft dann immer in ner Schleife durch - wenn dort zwischendurch der Knüppel wieder in der Mitte war und dann wieder rechts, dann springst Du weiter in ne Schleife "Strobe und Beacon", wenn Knüppel links kommt, dann wieder auf "aus"

und in der Strobe-und-Beacon-Schleife abfragen, wenn Knüppel links, dann zurück in die erste Schleife...

dann kannst Du das frei schalten: Knüppel einmal rechts = Strobe, noch mal rechts = Strobe + Beacon, Knüppel nach links = wieder nur Strobe, noch mal links = wieder komplett aus...

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... ;)

Und nochmal EDIT: wegen dem Quarz, wenn da genug Unterschied in der Pulslänge ist (also nicht gerade Mittelstellung = 1 µs, Rechtsanschlag = 1,1 µs oder so, dann sollte das auch ohne Quarz gut gehen... der interne RC-Oszi ohne Teiler ist aber doch 8 MHz und nicht 9,6...?!?
It's only light - but we like it!

Da es sich in letzter Zeit häuft: Ich beantworte keine PNs mit Fragen, die sich auch im Forum beantworten lassen!
Insbesondere solche von Mitgliedern mit 0 Beiträgen, die dann meist auch noch Sachen fragen, die bereits im entsprechenden Thread beantwortet wurden.
Ich bin keine private Bastler-Hotline, technische Tipps etc. sollen möglichst vielen Lesern im Forum helfen!

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »Pesi« (21. Januar 2010, 22:41)

  • Zum Seitenanfang

exelero

Junior LedStyler

Beiträge: 151

Wohnort: Hamburg

Beruf: Elektroniker

8

Freitag, 22. Januar 2010, 16:35

Hi

Danke Pesi für deine Anmerkungen :) . Ich find die Ideen auch alle super aber um ehrlich zu sein war ich schon froh das ich den Code hinbekommen habe...

Zu den Oszi kann ich nix sagen (wegen keiner Ahnung und Fresse halten und so ;) ) 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.

@Pesi: Würdest du mir (bzw. allen Mitlesern) den Code soweit verändern das man:
- Knüppel "Null" Stellung: Nichts
- Rechts: Strobe an
- Null: Nichts
- Rechts: Strobe + Beacon an
- Null: Nichts
- Rechts: Strobe + Beacon aus

und unabhängig davon noch nach links einen anderen Pin schalten (zb. )
- Knüppel Null: Nichts
- Links: An
- Null: Nichts
- Links: Aus

Quasi genau so wie du in deinem Edit meintest. Ich habe das nur nochmal wiederholt.

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... ;)
Mit der Software hätte wären dann ja alle Möglichkeiten ausgereitzt :D .
Schafft du dir den Code einfach so aus den Handgelenken zu schütteln? Ich schaffe das nähmlich nicht mit den Interrupts usw. Aber als Belohnung könnte ich dir exklusiv ein (das erste) Crashvideo präsentieren (youtube :rolleyes: )
Der nächst Crash kommt garantiert (gleich mal weiter den Rumpf kleben 8| )

gruß
  • Zum Seitenanfang

Jakob

Senior LedStyler

Beiträge: 214

Wohnort: Buxtehude

Beruf: Konstruktionsmechaniker Ausbildung

9

Freitag, 22. Januar 2010, 16:44

Das Angebot mit dem Crashvideo find ich ja mal hammergeil :D:D:D
Echt keine schlechte Idee...

Das Programm wird übrigens ohne Interrupts geschrieben, weil der Signal eingang garnicht auf einem INT Pin liegt.

Aber so ein Programm schüttel ich mir auch nicht aus dem Handgelenk.

Jakob
  • Zum Seitenanfang

exelero

Junior LedStyler

Beiträge: 151

Wohnort: Hamburg

Beruf: Elektroniker

10

Freitag, 22. Januar 2010, 16:48

Muss man nicht Software Interrupts einsetzen wenn man innerhalb der "Knüppel rechts" Schleife den Knüppel nach links bewegt?
Also den Code möcht ich sehen!!! (Natürlich mit meinem Pflichtenheft verbunden) :whistling: :P ;)

gruß
  • Zum Seitenanfang

Jakob

Senior LedStyler

Beiträge: 214

Wohnort: Buxtehude

Beruf: Konstruktionsmechaniker Ausbildung

11

Freitag, 22. Januar 2010, 16:51

Ja aber man fragt mit eine IF THEN Schleife ab, und bei einem Interrupt wir eine Sub Routine ausgelöst.

Also anders kann ich es mir ncht vorstellen, aber Pesi wird uns das beantworten...

Jakob

EDIT: Wo wohnst du in Hamburg, komme aus Buxtehude ;)
  • Zum Seitenanfang

exelero

Junior LedStyler

Beiträge: 151

Wohnort: Hamburg

Beruf: Elektroniker

12

Freitag, 22. Januar 2010, 21:57

Hamburg habe ich nur als grobe Richtung angeschlagen - aus Datenschutzgründen, Sie verstehen? :D
Ich wohne bei dir fast um die Ecke also von HH aus in Richtung Bremen.

gruß

Warum eig.?
Hast auch n Modellflieger? Dann könn wir ja um die Wette crashen :pinch: ^^
  • Zum Seitenanfang

Pesi

Golden LedStyler

Beiträge: 6 315

Wohnort: Home of the Pope

Beruf: Mischling

13

Samstag, 23. Januar 2010, 00:29

Sorry, habe vorhin noch Besuch bekommen, und jetzt gehe ich dann in's Bett - morgen bin ich den ganzen Tag unterwegs, aber am Sonntag mach' ich dann mal die SW, versprochen!
It's only light - but we like it!

Da es sich in letzter Zeit häuft: Ich beantworte keine PNs mit Fragen, die sich auch im Forum beantworten lassen!
Insbesondere solche von Mitgliedern mit 0 Beiträgen, die dann meist auch noch Sachen fragen, die bereits im entsprechenden Thread beantwortet wurden.
Ich bin keine private Bastler-Hotline, technische Tipps etc. sollen möglichst vielen Lesern im Forum helfen!
  • Zum Seitenanfang

samotronta05

Senior LedStyler

Beiträge: 289

Wohnort: 500 km geradeaus, dann links

14

Samstag, 23. Januar 2010, 00:33

Brauchst du nicht zu machen. Ich teste gerade noch, aber bis jetzt geht alles bis auf mein Senderakku :pinch:
Edit so alles Fertig:

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...?!?

Ja ursprünglich war aber vom Attiny13 die Rede und da sagt das Datenblatt auf Seite 25 4,8Mhz oder 9,6Mhz, beim Attiny2313 sind das aber natürlich 8Mhz.

Getestet hab ich das ganze ebenfalls mit einem RC-Oszi mit 8Mhz, allerdings auf einem 644.
Siehe hier:Klick
Der Strobe kommt leider durch die Kamera extrem schlecht rüber....sieht in echt hundert mal besser aus, fast wie das orginal.

Ich hoffe der Code ist so verständlich und übersichtlich.
Fragen?, Fragen!

Edit2:
Da die ganzen Kommentare verrutscht sind einfach hier herunterladen dann passt die Formatierung auch: Rechtsklick speichern unter


So jetzt will ich Schrott sehn :D
Greetz
Samotronta05, der sich jetzt wieder mit Delphi und der verdammten d2xx.dll rumschlagen darf...

Dieser Beitrag wurde bereits 7 mal editiert, zuletzt von »samotronta05« (23. Januar 2010, 03:12)

  • Zum Seitenanfang

exelero

Junior LedStyler

Beiträge: 151

Wohnort: Hamburg

Beruf: Elektroniker

15

Samstag, 23. Januar 2010, 16:01

Ich hoffe der Code ist so verständlich und übersichtlich.
Fragen?, Fragen!
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 it :thumbdown: ) 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?

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


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 ?

Gruß

Ich hoffe du hast alle meine Fragen verstanden

PS: @Pesi: du bekommst natürlich auch das Video exklusiv als PN :thumbup: . Morgen geh ich wieder mitn Kumpel fliegen ääh ich meine crashen :rolleyes: ;( (Mit Cam ;) )
  • Zum Seitenanfang

samotronta05

Senior LedStyler

Beiträge: 289

Wohnort: 500 km geradeaus, dann links

16

Samstag, 23. Januar 2010, 16:35

Ich hoffe der Code ist so verständlich und übersichtlich.
Fragen?, Fragen!
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 it :thumbdown: ) 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?


Also das mit dem Prescaler ist schon korrekt, nur der Rest stimmt nicht.
Erstmal läuft der Timer von 100 weg also nur noch 156 Schritte, nur beim ersten mal halt die 256 Schritte, weil ich vergessen habe oben Timer0 = 100 einzufügen, macht aber auch nichts.
Zweitens hast du die Division vertauscht. Es sind 7812,5 pro Sekunde, dass heißt man muss die 156 durch 7812,5 teilen und das sind dann 0,019968 Sekunden bzw. ca. 20ms.
Ansonsten empfehle ich dir das hier, wenn man zu faul zum Rechnen ist: Klick




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 Strobe wird tatsächlich erst nachdem der Interrupt durch den Timer zweimal ausgelöst wurde aktiviert, beim ersten Aufruf ist Zaehler ja noch null und da er in der Case-Abfrage keinen Befehl findet den er bei 0 ausführen soll, macht er mit dem Rest weiter und Zählt dann hoch, sodass nach 20ms das Strobe aktiviert wird.
Ansonsten würde das Strobe immer aktiviert, wenn man es ausschalten möchte, denn wenn alles aus ist, ist Zaehler = 0, um zu vermeiden, dass ein Licht an bleibt und die 20ms Verzögerung beim Einschalten merkt man eh nicht.
Der Timer zählt von 100 weg, also 256-100=156 Schritte um auf die 20ms zu kommen, wie oben erklärt.
Wenn sonst noch was unklar ist, gilt einfach Fragen.
Gruß
  • Zum Seitenanfang

exelero

Junior LedStyler

Beiträge: 151

Wohnort: Hamburg

Beruf: Elektroniker

17

Sonntag, 24. Januar 2010, 16:44

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)?
Den zweiten Kanal habe ich erstmal weggelassen weil ich nicht weiß wo der angeschlossen wird



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.

gruß
  • Zum Seitenanfang

samotronta05

Senior LedStyler

Beiträge: 289

Wohnort: 500 km geradeaus, dann links

18

Sonntag, 24. Januar 2010, 20:06

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.


Danke, ich muss aber gestehen, dass ich mich auch erst ein Jahr mit den Avrs beschäftige.


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


Korrekt hier muss man aber unterscheiden, ich habe ausgerechnet, dass der Timer0 alle 20 ms ausgeführt wird, in deiner Rechnung wird die Hertzzahl ausgerechnet.
Es kommt aber das gleiche raus, denn 50,08 Hertz ergeben: 1 Sekunde / 50,08 Hertz = 0.019968 Sekunde bzw. ca. 20 ms.

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?


Ohh stimmt hab ich einfach übersehen, weil ich die Anschlüsse nachher noch geändert habe, da ich das ganze auf einem Atmega644 getestet habe.

Grundsätzlich kannst du aber jeden Pin nehmen, ich würde jedoch die Pinne des Programmers, die UART und den Quarz freihalten, denn man ärgert sich, wenn man genau diese Pinne später nochmal braucht. Ansonsten einfach so belegen, dass es am besten zum Layout passt.



Ich habe mal einen Schaltplan fertig gemacht.
Findet dort jemand etwas was mach besser machen kann(Größen der Widerstände,Kapazitäten)?


ISP nach RN-Standard ?
Man könnte auch einen 6-Pin ISP-Anschluss verwenden um Platz zu sparen.
Als Pullup am Reset würde ich 10k nehmen, da ansonsten manche Programmer den Pegel nicht sauber auf Low ziehen.
Eventuell noch einen kleinen Elko parallel zum Abblockkondensator schalten.



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.


Hmm du bringst mich auf die Idee meinen Flieger mal wieder rauszuholen. *schon mal den Sekundenkleber suchen*
Gruß
  • Zum Seitenanfang

dgoersch

Silver LedStyler

Beiträge: 4 217

Wohnort: Viersen

Beruf: Fachinformatiker / Entwickler Linux/Asterisk

19

Sonntag, 24. Januar 2010, 22:47

Wegen dem Timer... wieso nicht einfach so konfigurieren, dass er alle 20ms einen Interrupt auslöst? Wenn ich das richtig sehe, ist das doch die kleinste benötigste Zeitspanne.

Folgende Werte lösen laut AVR-Timer-Calculator nach genau 20000µs mit dem 16bit Timer einen Interrupt aus:

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)

  • Zum Seitenanfang

Pesi

Golden LedStyler

Beiträge: 6 315

Wohnort: Home of the Pope

Beruf: Mischling

20

Sonntag, 24. Januar 2010, 23:10

?( - *ist* doch so konfiguriert:


Quellcode

1
Isr_timer0:   	'wird alle 20ms ausgeführt

It's only light - but we like it!

Da es sich in letzter Zeit häuft: Ich beantworte keine PNs mit Fragen, die sich auch im Forum beantworten lassen!
Insbesondere solche von Mitgliedern mit 0 Beiträgen, die dann meist auch noch Sachen fragen, die bereits im entsprechenden Thread beantwortet wurden.
Ich bin keine private Bastler-Hotline, technische Tipps etc. sollen möglichst vielen Lesern im Forum helfen!
  • Zum Seitenanfang