Robs0412
29.07.2006, 06:43
Hallo BASCOM User,
ich als absoluter Einsteiger habe eine Frage zu einem meiner ersten Codes.
Diese habe ich schon mal im www.mikrocontroller.de (http://www.mikrocontroller.net/forum/read-1-388117.html) Forum gepostet wollte mir aber auch noch einmal hier Rat holen.
Kurze Story:
Bin KFZ Student und für eine Studienarbeit (Benzineinspritzung) will ich ein einfaches Steuergerät „bauen“.
Dazu habe ich mir als einfachen Bausatz das myAVR Board besorgt, mit einem ATmega88.
Des Weiteren nutze ich BASCOM 1.11.8.3 Demo, da mir Basic als Newbie am verständlichsten ist.
Habe jetzt leider noch nichts mit meinem Board testen können, da mir immer noch die Kabel zum PC fehlen (an was man eben nicht alles denkt…)
Dennoch war ich in BASCOM schon aktiv und habe den Simulator zum Testen genutzt und mir auch schon mein Programmablauf zusammengestrickt.
Jetzt meine Bitte an euch: könntet Ihr bitte mal drüber schauen und sagen, ob das so funktioniert bzw. ob vielleicht „was fehlt“.
Hier mein Code:
$regfile = "m88def.dat"
$crystal = 8000000
Config Timer1 = Timer , Prescale = 8 , Compare A = Clear 'Timer1 konfigurieren und aller 8 µC Takte einen hochzählen, aktiver Compare um EV auszuschalten
Enable Interrupts 'generell Interrupts zulassen
Enable Int0 'schalte den Interrupt ein
Config Int0 = Change 'Konfiguriere Interrupt, immer bei sich ändernder Flanke auslösen
On Int0 Zuendimpuls 'verzweige bei Int0 zu Zuendimpuls
Config Adc = Free , Prescaler = Auto , Reference = Avcc 'konfigurieren des ADC; Referenzspannung ist AVCC
Start Adc 'starten des ADC
Dim Wandler As Word 'Wandler Wert vom ADC (0 - 1023)
Dim C As Single 'Comparewert
Dim T As Integer 'T als Timerwert für Drehzahlberechnung
Ddrb.1 = 1 ' Port B1 (Compare OC1A) auf Ausgang
Portb.1 = 0 ' Port B1 (Compare OC1A) auf 0 (aus)
Hauptprogramm: 'Berechnungen
Do
Wandler = Getadc(0) 'ADC auslesen PC0
C = 0.00000000000000131974135394725 * Wandler 'verschiedene Berechnungen um neuen Comparewert zu berechnen
C = C - 0.00000000000304531013708812
C = C * Wandler
C = C + 0.00000000293446297432095
C = C * Wandler
C = C - 0.0000013743960103502
C = C * Wandler
C = C + 0.000377268967063757
C = C * Wandler
C = C - 0.0404534637863069
C = C * Wandler
C = C + 0.0474943050494277
C = T * C
C = C * 0.00000007160759
C = 500000 * C
Loop
End
Zuendimpuls:
T = Timer1 'Timerwert zwischenspeichern
Portb.1 = 1 ' Port B1 (Compare OC1A) auf 1 (an), solange, bis compare ihn ausschaltet
Compare1a = C 'neuen Comparewert laden, um nach bestimmter Zeit EV wieder zu schließen
Timer1 = 0
Return
Zusammenfassung:
Immer, wenn ein Zündimpuls erkannt wird, soll Port B1 aktiviert werden (5V) und solange anbleiben, wie zwischendurch in der Hauptschleife berechnet wurde (Wert für Compare).
Port B1 soll dann mit Compare wieder ausgeschalten werden.
Meine Frage, die ich jetzt noch habe:
1) Würde mein Programm so funktionieren?
2) Welche Taktfrequenzen kann der 88er intern erzeugen (wollte für Berechnungen schneller als 3,6 MHz sein)
3) Laut anderem Forum muss ich den ADC Kanal (0) vorher noch als Eingang definieren ohne Pull up; wäre dieser Code richtig? :
Ddrc.0=0
Portc.0=0
4) Muss ich Int0 auch noch als Eingang definieren?
5) Was mach ich mit den restlichen Ports? In einen definierten Zustand bringen?
6) Im Simulator schaltet sich die LED für den Port B1 nicht an und aus, wie gedacht, liegts am Code oder funzt dies nicht im Simulator
Vielen Dank und viele Grüße!
Robert :-)
ich als absoluter Einsteiger habe eine Frage zu einem meiner ersten Codes.
Diese habe ich schon mal im www.mikrocontroller.de (http://www.mikrocontroller.net/forum/read-1-388117.html) Forum gepostet wollte mir aber auch noch einmal hier Rat holen.
Kurze Story:
Bin KFZ Student und für eine Studienarbeit (Benzineinspritzung) will ich ein einfaches Steuergerät „bauen“.
Dazu habe ich mir als einfachen Bausatz das myAVR Board besorgt, mit einem ATmega88.
Des Weiteren nutze ich BASCOM 1.11.8.3 Demo, da mir Basic als Newbie am verständlichsten ist.
Habe jetzt leider noch nichts mit meinem Board testen können, da mir immer noch die Kabel zum PC fehlen (an was man eben nicht alles denkt…)
Dennoch war ich in BASCOM schon aktiv und habe den Simulator zum Testen genutzt und mir auch schon mein Programmablauf zusammengestrickt.
Jetzt meine Bitte an euch: könntet Ihr bitte mal drüber schauen und sagen, ob das so funktioniert bzw. ob vielleicht „was fehlt“.
Hier mein Code:
$regfile = "m88def.dat"
$crystal = 8000000
Config Timer1 = Timer , Prescale = 8 , Compare A = Clear 'Timer1 konfigurieren und aller 8 µC Takte einen hochzählen, aktiver Compare um EV auszuschalten
Enable Interrupts 'generell Interrupts zulassen
Enable Int0 'schalte den Interrupt ein
Config Int0 = Change 'Konfiguriere Interrupt, immer bei sich ändernder Flanke auslösen
On Int0 Zuendimpuls 'verzweige bei Int0 zu Zuendimpuls
Config Adc = Free , Prescaler = Auto , Reference = Avcc 'konfigurieren des ADC; Referenzspannung ist AVCC
Start Adc 'starten des ADC
Dim Wandler As Word 'Wandler Wert vom ADC (0 - 1023)
Dim C As Single 'Comparewert
Dim T As Integer 'T als Timerwert für Drehzahlberechnung
Ddrb.1 = 1 ' Port B1 (Compare OC1A) auf Ausgang
Portb.1 = 0 ' Port B1 (Compare OC1A) auf 0 (aus)
Hauptprogramm: 'Berechnungen
Do
Wandler = Getadc(0) 'ADC auslesen PC0
C = 0.00000000000000131974135394725 * Wandler 'verschiedene Berechnungen um neuen Comparewert zu berechnen
C = C - 0.00000000000304531013708812
C = C * Wandler
C = C + 0.00000000293446297432095
C = C * Wandler
C = C - 0.0000013743960103502
C = C * Wandler
C = C + 0.000377268967063757
C = C * Wandler
C = C - 0.0404534637863069
C = C * Wandler
C = C + 0.0474943050494277
C = T * C
C = C * 0.00000007160759
C = 500000 * C
Loop
End
Zuendimpuls:
T = Timer1 'Timerwert zwischenspeichern
Portb.1 = 1 ' Port B1 (Compare OC1A) auf 1 (an), solange, bis compare ihn ausschaltet
Compare1a = C 'neuen Comparewert laden, um nach bestimmter Zeit EV wieder zu schließen
Timer1 = 0
Return
Zusammenfassung:
Immer, wenn ein Zündimpuls erkannt wird, soll Port B1 aktiviert werden (5V) und solange anbleiben, wie zwischendurch in der Hauptschleife berechnet wurde (Wert für Compare).
Port B1 soll dann mit Compare wieder ausgeschalten werden.
Meine Frage, die ich jetzt noch habe:
1) Würde mein Programm so funktionieren?
2) Welche Taktfrequenzen kann der 88er intern erzeugen (wollte für Berechnungen schneller als 3,6 MHz sein)
3) Laut anderem Forum muss ich den ADC Kanal (0) vorher noch als Eingang definieren ohne Pull up; wäre dieser Code richtig? :
Ddrc.0=0
Portc.0=0
4) Muss ich Int0 auch noch als Eingang definieren?
5) Was mach ich mit den restlichen Ports? In einen definierten Zustand bringen?
6) Im Simulator schaltet sich die LED für den Port B1 nicht an und aus, wie gedacht, liegts am Code oder funzt dies nicht im Simulator
Vielen Dank und viele Grüße!
Robert :-)