AVR: 8515 <-- Vorgänger vom Atmega STK500 So Denn, Ich habe ganze 4 Beiträge gefunden die sich mit Compare 1 Beschäftigen und 0!! die mehr machen :( Also Gut. Ich Programmiere grade einen Frequenzgenerator mit Einstellbarer Pulsweite. Bei 50% Pulsweite ist die Sache ganz ein Fach, ich lasse einfach PIND 5 toggeln. Aber bei 25% oder 75% ist schon mehr nötig. Bisher lasse ich den PIND 5 toggeln UND die ISR auslösen. Die ISR Schreibt denn, ja nach PIN 0 oder 1 den Wert für 25 oder 75% in das OCR1A. Daraus ergeben Sich aber Performance Nachteile und "ungenaue" Pulsweiten. Denn wenn der Interuppt grade gesperrt ist, kann er die PW nicht ändern. Nun hatte ich die Tolle Idee, einfach den Compare B mit zu nutzen. Ich musste aber ganz schnell feststellen, das der nen Anderen Pin schaltet. Also muss wieder der PIND 5 getoggelt werden. Meine Strategie: Compare B löst aus --> PIND5 über ISR einschalten --> Compare A löst DANACH aus, PIND 5 über TCCR1A ausschalten und Timer Löschen (Von Vorne beginnen). In der Simulation geht das noch, aber in echt gehts nicht. Es gibt nur ne Flatline. Frequenzen sind von 100Hz bis 10KHz. Nachmessen tue ich über ein DSO. Hat jemand erfahrung damit oder ist das sogar ein BUG in der CPU??? MFG Sunsetraving
AT90S8515, also externer Quarz. Gehen wir mal vom schlechtesten Fall aus, einem Quarztakt von 1MHz. Du willst Frequenzen bis 10kHz erzeugen, das sind minimal 100 Takte pro Periode, also pro zwei Portpin-Aktionen. Es ist also geradeso noch möglich, den Portpin von Hand zu setzen. Bei schnellerem Quarz bleibt natürlich mehr Spielraum. Im Prinzip kann das ein Compare-Interrupt alleine, es spart aber vermutlich Rechnerei (bedingte Verzweigerei), mit beiden Compare-Interrupts zu arbeiten. Compare1A könnte - den Portin setzen (H) - OCR1A (nicht TCNT1!) einlesen - zu einer Kopie davon die Periodendauer addieren und nach OCR1A zurück schreiben - zur anderen Kopie die Impulsdauer addieren und in OCR1B schreiben Compare1B könnte: - den Portpin rücksetzen (L) Die Mainloop könnte in aller Ruhe die Werte für Periodendauer und Impulsdauer errechnen und bereitstellen und sich um den Rest (Taster, Display, usw.) kümmern. Es gibt vermutlich bessere Konzepte, aber so würde ich es zu lösen versuchen. ...
Ich würde Dir einen neueren AVR empfehlen, die sind mit weitaus mehr Timern und besseren Features (doppelt gepufferte OC-Register) ausgestattet. Auf dem 90S8515 verrenkst Du Dir den Arm mit solchen Dingen
Ist ein Guter Ansatz von dir. Allerdings habe ich die Werte in Tabellenform bereits Fest Vorliegen. Hab mit nem script wahnsenig viele Werte erechnen lassen und dann ins SRAM geschrieben. Also Rechnen ist nicht nötig. Ich versuche grad mal den Externen Interupt auszulösen, in dem ich einfach den OCR1B Pin auf extern I0 lege und dann über die ISR Den Pin wieder abschalte und PIND 5 darüber toggel ... Aber Prinzipiell würde ich schon meine "erste" Verion vorziehen. Aber Irgendwie mag der Prozessor nicht. Quarz ist Übrigens auf 3,686MHz.. Mit meiner "NUR COMP A" Methode schaffe ich 90kHz 50% und 40kHz 25%.. Falls es interessiert ;)
Ich habe gerade mal ins Datenblatt geschaut. Wenn Du CTC1-Flag setzt, macht der Timer1 bei Compare1A einen Reset, beginnt also bei 0. Du brauchst dann nur noch in ocr1A die Periodendauer und in OBR1B die Impulsdauer einzutragen. Die Interrupts bedienen dann lediglich den Portpin (einer setzt, einer löscht). Da sbi und cbi keine Flags beeinflusst, ist keine SREG-Sicherung erforderlich. Die ISRs werden also recht schnell. Die Mainloop hat also alle Zeit der Welt, aus irgendwelchen Ereignissen die Werte für Periodendauer und Impulsdauer bereitzustellen und in die entsprechenden I/O-Register einzutragen. ...
> Mit meiner "NUR COMP A" Methode schaffe ich 90kHz 50% und 40kHz 25%.. > Falls es interessiert ;) ja sicher, aber nicht mit gleitendem Tastgrad (alle Zwischenwerte möglich), von dem ich ausging. Wenn Du nur 25%, 50% und 75% brauchst, dann wird das auch bedeutend schneller gehen. ... EDIT: Ich ging davon aus, dass variabler Tastgrad und variable Frequenz erforderlich sei und Beides möglichst stufenlos (stufenarm) eingestellt bzw. während des Betriebes verändert werden soll. ...
Ja, wenn es denn mal fertig ist ;) Aber immo arbeite ich mit festen Werten. Wobei ich später einfach 51 Tabellen haben werde und das EEPROM mal nutze... Wenn es schon mal da ist. Das Problem was ich habe, ich mach das erst seit nem Viertel Jahr und was Rechnen mit 16Bit Ints angeht und ohne Flieskomma zahlen.. Da kann ich leider die Pulsdauer nicht errechnen :(
Denny Breuer wrote: > Ja, wenn es denn mal fertig ist ;) Gut, dann ist mein Ansatz ja gar nicht mal falsch. > > Aber immo arbeite ich mit festen Werten. Wobei ich später einfach 51 > Tabellen haben werde und das EEPROM mal nutze... Wenn es schon mal da > ist. Da ich nicht weiß, was Dein Gerät mal können soll, kann ich leider nicht darauf eingehen, das wäre reine Spekulation. > > Das Problem was ich habe, ich mach das erst seit nem Viertel Jahr und > was Rechnen mit 16Bit Ints angeht und ohne Flieskomma zahlen.. Da kann > ich leider die Pulsdauer nicht errechnen :( Nunja, jetzt greift Travel Rec.'s Vorschlag, die ATMegas können in Hardware multiplizieren. Aber Multiplikation und Division geht auch in Software mit vertretbarem Aufwand, Fließkomma ist da nicht erforderlich. Denke mal an die Grundschule zurück und multipliziere/dividiere mal "schriftlich" (also zifferweise) durch fortgesetzte Addition oder Subtraktion. Und setze das dann mal in binär um (mal 2 oder durch 2 erreicht man durch Schieben/rotieren des Registerinhalts). Du wirst staunen, wie effizient das sein kann. Bei ATMEL (und auf Deiner STK500-CD) sind Appnotes, da ist mit Sicherheit eine dabei, die das Multiplizieren und Dividieren in Software beschreibt. ...
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.