Hallo, für eine Studienarbeit im Bereich KFZ Technik muss ich mich als absoluter Einsteiger auf unbekanntes µC Gebiet begeben. Ich nutze dazu das myAVR Board, da hier der Aufbau ja recht einfach ist und zur Programmierung BASCOM, da Basic für mich noch verständlich ist. Habe jetzt leider noch nichts mit meinem Board machen können, da mir 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 der Code mit ein paar Bemerkungen bzw. Fragen: µC ist ein ATmega88 $regfile = "m88def.dat" $crystal = 20000000 --> muss schnell laufen, da Drehzahlkritische Anwendung Config Timer1 = Timer , Prescale = 64 , Compare A = Clear --> Compare soll OC1A beim Erreichen des Comparewertes ausschalten (0V), Timer darf schon loslaufen Enable Interrupts --> mit Interrupt Int0 soll Drehzahl bestimmt werden Enable Int0 Config Int0 = Change --> Int0 jeweils bei sich ändernder Flanke des Hall-Sensors On Int0 Zuendimpuls --> bei Int0 zu Zuendimpuls springen Config Adc = Free , Prescaler = Auto , Reference = Avcc --> ADC zum Analogsignal messen, kontinuerliche Messung, für Berechnungen im Hauptprogramm Start Adc Dim As --> verschiedenste Variablen für Berechnung definieren Dim Ddrb.1 = 1 -->Port B1 (OC1A) als Ausgang deklarieren (muss ich das tun?) Portb.1 = 0 -->Port B1 (OC1A) auf aus (0V) Hauptprogramm: Do verschiedenste Berechnungen, die im Simulator bestens funktionieren Loop End Zuendimpuls: T = Timer1 -->Zwischenspeichern des Timerwertes für neue Berechnungen im Hauptprogramm Timer1 = 0 -->Timer wieder von vorn loslaufen lassen Compare1a = C -->neuen Comparewert laden (C aus Berechnungen im Hauptprogramm) Portb.1 = 1 --> Port B1 (OC1A) auf an (5V), solange bis Comparewert erreicht wird, dann CLEAR, wie beim Timer definiert (also aus) 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. Port B1 soll dann mit Compare wieder ausgeschalten werden. Ich benutze beim Compare Befehl nicht Toggle, da ich sicher sein muss, dass, falls verfrüht wieder Compare auftritt, Port B1 auch wirklich aus bleibt. Würde mein Programm so funktionieren? Vielen Dank! Robert
> $crystal = 20000000 --> muss schnell laufen, > da Drehzahlkritische Anwendung Hier steckt wahrscheinlich schon der erste Denkfehler. Du stellst hier keineswegs die Taktfrequenz des µC ein. Die Taktfrequenz des µC richtet sich ausschliesslich nach dem angeschlossenen Quarz (bzw. kann man bei Verwendung des internen Taktgenerators zwischen ein paar Frequenzen per *Fuse* umschalten. Die Angabe hier teilt einfach nur BASCOM mit, mit welcher Frequenz der µC tatsächlich läuft. Dies deshalb damit BASCOM Warteschleifen richtig dimensionieren kann.
Hallo, richtig, ich möchte auch nicht den externen Quarz nutzen, sondern den internen, auch, wenn dieser ungenau ist. Für meinen Zweg benötige ich kein genaues Signal, sondern nur den schnellen µC. Klappt das mit Port B1 (OC1A) so, wie ich mir das vorstelle? Danke und Grüße Robert
Ich denke, daß der interne Oszillator mit 1Mhz schwingt. Wenn Du den Professor schneller takten willst, mußt Du mit externem Quarz ans Werk gehen oder den Takt mit einem anderen Generator (z.B. aus Logikgattern) erzeugen. mfG Paul
Hi, da muss ich nochmal schauen. Muss ich den ADC Kanal vorher eigentlich noch als Eingang definieren? Grüße Robert
1.: Ja, der ADC-Kanal muss als Eingang definiert sein und es darf kein Pull-Up an dem Pin aktiv sein (also PORTB.X = 0)! 2.: Der interne RC-Oszillator läuft mit 8 MHz. Wenn man die CKDIV8-Fuse löscht, hat man die auch als Takt zur Verfügung. Im Auslieferungszustand ist diese Fuse aber programmiert, so dass tatsächlich ein Takt von 1 MHz als Taktquelle vorliegt. Man kann den Oszillator auch auf Frequenzen höher als 8 MHz trimmen (mit dem OSCCAL-Register), aber dann garantiert der Hersteller keine 100%ige Funktionalität mehr.
> 1.: Ja, der ADC-Kanal muss als Eingang definiert sein und es darf > kein > Pull-Up an dem Pin aktiv sein (also PORTB.X = 0)! Völlig korrekt. Beim Mega 48/88/168 sollte man zusätzlich noch den Digitalteil des Eingangs deaktivieren (DIDR0), um den Messeingang noch weniger zu belasten und Strom zu sparen. > 2.: Der interne RC-Oszillator läuft mit 8 MHz. Wenn man die > CKDIV8-Fuse löscht, hat man die auch als Takt zur Verfügung. Das Löschen der Fuse ist nicht erforderlich, man kann den Vorteiler auch vom Programm auf 1:1 einstellen (CLKPR). Das sollte besonders Dem helfen, der mit den Fuses noch nicht so vertraut ist. @johny.m: Bitte nicht als Besserwisserei verstehen, nur als Ergänzung. Bit- & Bytebruch... ...HanneS...
@Hannes: Nö, ist kein Problem. Ich weiß, was das Forum und der Rest der Welt an Leuten wie Dir haben. Wenn man es wirklich besser weiß (und das ist bei Dir sicher der Fall, bei der Erfahrung...), dann soll man es auch einbringen, gell?
Danke! werd mich weiter durcharbeiten und mein "Progrämmchen" erst mal mit LEDs testen. Super Hilfe! Grüße! Robert
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.