-
Halllo
Habe jetzt probiert... aber ganz so wie ich mir das gedacht hatte, läuft es leider nicht. :-( (regelt nicht so recht)
Irgendwie bräuchte ich da zwei 16-Bit Timer... :-k
Hier mal der Code zum begutachten 8-[
Code:
'--------Drehlicht-----V1.07---------------
' 8MHz RC Intern
$regfile = "m8def.dat"
$crystal = 8000000
$hwstack = 200
$swstack = 200
$framesize = 200
'---Config Port's -----------------
Config Portb = Output
Portb = 255
Config Portd = Input
Portd = 255
'---config Int0------
Config Int0 = Falling
Enable Int0
On Int0 Kontakt
'--- Config Timer1 ----
Config Timer1 = Timer , Prescale = 1024
Enable Timer1
'--- Config Timer0 ------
Config Timer0 = Timer , Prescale = 1
Enable Timer0
Enable Interrupts
Load Timer0 , 255
Dim Drehzeit As Word
Dim Spaltenzeit As Byte
Dim Auftrag As Word
Auftrag = 0
'--------------------Hauptprogramm--------------------------
Do
Loop
End
'==============================Unterprogramme===================================
'--------------ISR von Int0--------------------
Kontakt:
Drehzeit = Timer1
Timer1 = 0
Spaltenzeit = Drehzeit / 360
Auftrag = 0
Return
'------------ISR von Timer0 --------------------
Spalten:
Load Timer0 , Spaltenzeit
If Auftrag < 50 Then
Toggle Portb
Incr Auftrag
End If
Return
Was meint ihr dazu ?
Drehzahl ist 1000 U/min
Quarz = 8MHz
-
Habs jetzt ein bisschengeändert.
Code:
'--------Drehlicht-----V1.07---------------
' 8MHz RC Intern
$regfile = "m8def.dat"
$crystal = 8000000
$hwstack = 200
$swstack = 200
$framesize = 200
'---Config Port's -----------------
Config Portb = Output
Portb = 255
Config Portd = Input
Portd = 255
'---config Int0------
Config Int0 = Falling
Enable Int0
On Int0 Kontakt
'--- Config Timer1 ----
Config Timer1 = Timer , Prescale = 1024
Enable Timer1
'--- Config Timer0 ------
Config Timer0 = Timer , Prescale = 8
Enable Timer0
On Timer0 Spalten
Enable Interrupts
Load Timer0 , 255
Dim Drehzeit As Word
Dim Spaltenzeit As Byte
Dim Auftrag As Word
Auftrag = 0
'--------------------Hauptprogramm--------------------------
Do
Loop
End
'==============================Unterprogramme===================================
'--------------ISR von Int0--------------------
Kontakt:
Drehzeit = Timer1
Timer1 = 0
Spaltenzeit = Drehzeit / 2
Auftrag = 0
Return
'------------ISR von Timer0 --------------------
Spalten:
Load Timer0 , Spaltenzeit
If Auftrag < 100 Then
Toggle Portb
Incr Auftrag
End If
Return
Der Simulator wollte kein Byte bei der Variabel : Spaltenzeit.
Bei AVR macht das aber nix aus. (Darum wieder auf Byte geändert)
Haltet jetzt so ungefähr die Lage. Aber nicht schön :-(
Wenn man den Motor in der Drehzahl verändert, merkt man genau wo er auf oder Abrundet .....
Ein zweiter 16bit Timer wäre da wohl viel genauer ](*,)
-
Nimm doch einfach nen M64 oder größer dann haste was de suchst.
-
Wie war es den bei dir ? (die Schrift)
Welcher AVR ?
Wie war dein Programm ? (Prinzip)
-
Schrifft:
Was meinste ?
Der Propeller war umlaufend also genaugenomen eine "Rotor-Clock"
Die Schrifft war relativ Stabil.
Keine Spielereien.
Bevor ich weitergewkommen bin lag das Teil am Boden.
Controller:
Ich hatte nen M128 drauf (Etwas Oversized.Lag gerade so rum)
Programmprinzip:
Eigentlich wie alle anderen.
Die Anzeige wird per Sync (Hallsensor) getriggert,die Drehzahl lag stabil bei 600upm.
Allerdings hatte ich an einer Datenübertragung gearbeitet um den Text per Serieller Schnittstelle immer passend ändern zu können.
Is aus obigem Grund ebenfalls nur im Rohbau gewesen.
-
hallo roberto!
ich hab mir jetzt auch so ein teil gebastelt :) nach langem herumprobieren mit den timern ohne erfolg, hab ich mal dein prog geladen... wenn ich die richtige drehzahl mal gefunden habe, habe ich etwa auf dem halben durchmesser schöne punkte nacheinander aber sie springen ca 3mm hin und her... sobald die drehzahl zu gering wird hab ich nur noch striche ringsum...
aber das müste man doch noch verbessern können...
gruss bluesmash
-
Hallo
Ich verstehe das auch nicht ganz....
Aber irgendwie habe ich mich jetzt da festgefressen ;-)
Vielleicht weis da jemand mehr ??
Also:
minimale Umdrehungen sind 500 U/min = 8,3 U/sek
Mittelere Umdrehungen sind 1000 U/min = 16,6 U/sek
Höchste Umdrehungen sind 1500 U/min = 25 U/sek.
Zwischen min und Max sollte es zumindest reglen!
Wenn ich jetzt für den Timer1 einen Prescaler mit 8 nehme, wären das für 1000 U/min, 60240,96 Takte pro Umdrehung und pro sek.
Jetzt teile ich die Takte pro Umdrehung durch 510, damit ich im Berreich vom Timer0 bleibe (1-256)
Also bei 1000 U/min, wäre dann ein Strich: 118,11 Takte vom Timer0
Wenn ich aber unter der ISR vom Timer0 einen Wert von 100 eintrage.
Also zeichne 100 Striche, dann füllt das schon fast den ganzen Kreis.
Eigentlich müsste ich ja 510 Striche Auftragen können ?!
Hier nochmal der aktuelle Code:
Code:
'--------Drehlicht-----V1.08---------------
' 8MHz RC Intern
$regfile = "m8def.dat"
$crystal = 8000000
$hwstack = 200
$swstack = 200
$framesize = 200
'---Config Port's -----------------
Config Portb = Output 'Leds
Portb = 255
Config Portd = Input
Portd = 255
'---config Int0------
Config Int0 = Falling
Enable Int0
On Int0 Kontakt
'--- Config Timer1 ----
Config Timer1 = Timer , Prescale = 8
Enable Timer1
'--- Config Timer0 ------
Config Timer0 = Timer , Prescale = 8
Enable Timer0
On Timer0 Spalten
Enable Interrupts
Load Timer0 , 255
Dim Drehzeit As Single
Dim Spaltenzeit As Word
Dim Auftrag As Single
Auftrag = 0
Timer1 = 0
'--------------------Hauptprogramm--------------------------
Do
Loop
End
'==============================Unterprogramme===================================
'--------------ISR von Int0--------------------
Kontakt:
Drehzeit = Timer1
Timer1 = 0
Spaltenzeit = Drehzeit / 510
Auftrag = 0
Return
'------------ISR von Timer0 --------------------
Spalten:
Load Timer0 , Spaltenzeit
If Auftrag < 100 Then
Toggle Portb
Incr Auftrag
End If
Return
Vielleicht kan sich jemand dieser Denkaufgabe stellen :-)
@Bluemash
Für dich habe ich noch den alten Code.
Ganze einfach! Startet einfach ab Kontakt vom Schalter und schreibt dann den Namen Andre in die Luft (Mein Junior :-) )
Geht für das eigentlich recht gut.
Mich störte nur, dass die Weite von der Drehzahl abhängt.
Code:
'--------Drehlicht-----V1.04---------------
' 8MHz RC Intern
'
'
' schreibt ANDRE !!!!!!
$regfile = "m8def.dat"
$crystal = 8000000
'---Config Port's -----------------
Config Portb = Output
Portb = 255
Config Portd = Input
Portd = 255
Dim A As Byte
Dim B As Byte
Dim B1 As Byte
A = 1
'--------------------Hauptprogramm--------------------------
Do
If Pind.2 = 0 Then
Waitms 5
Restore Xxx
'7*Zeichen lesen
For A = 1 To 7
'8*Spalten pro Zeichen lesen
For B = 1 To 8
Read B1
B1 = 255 - B1
Portb = B1
Waitus 20
Next B
Portb = 255 'Für Abstand zwischen den Zeichen
Waitus 200
Next A
End If
Portb = 255
Loop
End
'Red Message
Xxx:
Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 'Leerzeichen
Data 31 , 36 , 68 , 132 , 132 , 68 , 36 , 31 'A
Data 255 , 64 , 32 , 16 , 8 , 4 , 2 , 255 'N
Data 255 , 129 , 129 , 129 , 129 , 129 , 66 , 60 'D
Data 255 , 136 , 136 , 136 , 136 , 140 , 82 , 33 'R
Data 255 , 137 , 137 , 137 , 137 , 137 , 129 , 129 'E
Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 'Leerzeichen
-
danke! ich werde es heute abend mal ausprobieren :) per zufall stimmen alle ein und ausgänge bei mir überein :) aber als erstes muss ich mal die drehzahl erfassen hast du da eine gute idee? ich dachte ich lass ihn drehen und immer so nach 10 umdrehungen lass ich eine led mehr leuchten, zeit messen, led's zählen --> drehzahl... und dann mach ich mich mal an die timer, mal schauen ob man es noch genauer hinkriegt... das problem ist wahrscheinlich schon dass der mega8 nicht 2 16bit timer hat... :(
das mit der tabelle für die einzelnen buchstaben finde ich eine super idee! ich hätte es wahrscheinlich viel umständlicher gemacht...
gruss bluesmash
-
Hallo Bluesmash
Das mit den Buchstaben habe ich mir irgendwo abgeschaut.
Ich glaube auf der home von MCS...
Derzeit stutiere ich gerade, wie ich einen String in die Spalten auftragen kann ????????????????????
Habe noch keinen so richtigen Ansatz dafür :-(
Irgendwie in die Richtung, dass ich ein Array habe für alle Spalten...
Wenn ich einen String habe, müsste ich da zuerst dann die Zeichen analysieren, aus meinem Zeichensatz dann ein gleiches Zeichen suchen und die entsprechenden Werte dann ins Array schreiben...
Der Timmer läuft das Array durch.
Habe aber keine Ahnung ob der Lösungsansatz passt und wie ich das im BAscom umsetze ???? :-k :-k :-k :-k
-
ja darüber habe ich auch schon nachgedacht, aber ich habe auch noch nicht die perfekte idee, ausser mit if..then verknüpfungen für jeden buchstaben und ein array für jedes zeichen das dargestellt werden soll, und danach beim abspielen werden eifach die arrays durchlaufen...