- Akku Tests und Balkonkraftwerk Speicher         
Ergebnis 1 bis 10 von 18

Thema: 72kHz / 32kHz

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    62
    Beiträge
    5.799
    Blog-Einträge
    8
    Bei delay muss die Dauer der Verzögerung zur Kompilezeit bekannt sein. Nun könnte man auch auf Basis von delay auch eine variable Verzögerung konstruieren, aber dann ist der Aufwand nicht mehr kleiner als wenn man es gleich selbst auf der Basis der eigenen Lib umsetzt. Hier steht wohl der Lerneffekt im Vordergrund.

    Was sich die Macher des asuro damals, als sie das asuro-Konzept erbrütet haben, so alles gedacht haben, kann ich heute nur erahnen. Sowohl hard- wie auch softwaretechnisch eine echte Meisterleistung.
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    13.07.2011
    Beiträge
    20
    Moin ich nochmal zu diesem Thema,
    kannst du mir dies nochmal genauer erklären??
    Bei einem umgefuseten 9,6MHz-Tiny wären das ca. 80kHz. Das Feintuning der Frequenz müßte man am OCR0A einstellen.
    wi ekommt man da auf 80 kHz?

    Wenn ich den Tiny mit 9,2 MHz betreibe und durch 72kHz teile bekomme ich ca 128 und wenn ich den Zähler als CTC-Betriebsart programmiere dauert eine Periode 255-128=127 Takte wenn ich also OCR0A auf 127 einstelle, bekomme ich so die 72kHz? oder bin ich völlig auf dem falschen Dampfer?

    danke im Vorraus

    Gruß aus Hamburg
    Geändert von t1001hh (30.08.2011 um 09:32 Uhr)

  3. #3
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    62
    Beiträge
    5.799
    Blog-Einträge
    8
    Hallo

    Oje, frag mich nicht, was mich da geritten hat. Der Tiny im Beispielprogramm erzeugt die Servosignale mit 24kHz (1,2MHz/50) und deshalb sind das bei 9,2MHz keine 80kHz. Entschuldigung.

    Deine Berechnung ist fast richtig. Beim CTC-Mode zählt der Timer von 0 bis OCR0X, beim Match beginnt er wieder bei null und führt die ISR aus. Deshalb kannst du die 127,7 direkt ins OCR0X schreiben. Die Berechnung 256-128 gehört zum Overflow-Mode. Man berechnet so den Vorladewert des OCR0X um nach der gewünschten Zählertaktzahl einen Überlauf zu erhalten.

    Gruß

    mic
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    13.07.2011
    Beiträge
    20
    so ein mist der Tiny 13 hat ja 9,6MHz... also stimmt die Rechnung ja nicht dann muss ich den Zähler im CTC-Modus betreiben und rechne:
    9,6MHz durch 72kHz = 133,3333-> dies Teile ich durch 2 -> 66,5 sprich 67 also ziehe ich 67 von 256 ab und erhalte
    189 oder oxBD die ich im OCR0A/B Register schreibe
    bei 123 oder ox7B muss ich starten, also schreibe ich im Interrupt

    SIGNAL (SIG_OVERFLOW0)
    {
    TCNT0 += 0x7B;
    ....
    }

    bin ich soweit richtig? würde ich so 72kHz bekommen?
    Gruß aus Hamburg und nochmals vielen dank

  5. #5
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    62
    Beiträge
    5.799
    Blog-Einträge
    8
    Hallo

    CTC-Mode ohne Prescaler, die ISR wird alle 1/72000 Sekunde aufgerufen:
    Code:
    #include <avr/io.h>
    #include <avr/interrupt.h>
    
    ISR(TIM0_COMPA_vect)
    {
    }
    
    int main(void)
    {
    	TCCR0A = (0 << WGM00) | (1 << WGM01); // CTC-Mode
    	TCCR0A |= (0 << COM0A0) | (0 << COM0A1); // ohne OCR-Pin
    	TCCR0B = (0 << CS02) | (0 << CS01) | (1 << CS00); // kein prescaler!
    	TIMSK0 = (1 << OCIE0A); // Interrupt ein
    	OCR0A = 9600/72; // 9,6MHz/72kHz = 133,3
    	sei();
    
    	while(1)
    	{
    	}
    	return(0);
    }
    Genau sind es 9600/133=72,18kHz.

    Gruß

    mic


    btw.:
    "9,6MHz durch 72kHz = 133,3333-> dies Teile ich durch 2" Wieso denn /2?

    Und dann noch ne Frage: Was willst eigentlich du anstellen mit den 36/72kHz?
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    13.07.2011
    Beiträge
    20
    erstmal vielen dank für die immer sehr hilreiche Antwort

    durch 2 deshalb, weil ich am Ausgang ein Signal von 72khz benötige und der Ausgang doch bei der hälfte umschalten muss oder nicht???, bei deinem Vorschlag bekomme ich doch am Ausgang keine 72khz oder nicht? also ist der CTC Mode dann doch falsch?

    sollte man dann 36kHz nehmen und den Ausgang dann dabei toggeln? oder einen anderen Mode?
    Entschuldigung das ich mit der PWM ein wenig schwer tue


    72kHz benötige ich für die Schaltung für die Erweiterung Minesweeper, die ich auf einer extra Platine dazu gebaut habe und wollte dies mittels eigenen Controller umsetzen, der dann nur ein Signal an den ASURO sendet. Da die erweiterte lib mit 36kHz arbeitet und ich die Option für die IR Abstandsmessung offen lassen wollte habe ich mich für einen zusätzlichen Controller entschieden.

  7. #7
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    62
    Beiträge
    5.799
    Blog-Einträge
    8
    Hallo

    Danke für die Erklärungen. Aber was brauchst du nun wirklich? 36kHz, 72kHz oder gar 144kHz?

    Beim oben gezeigten Grundgerüst wird der Interrupt 72000 mal in der Sekunde ausgelöst und die ISR angeprungen. 72000 mal, weil eine Periode des 36kHz-Signals aus zwei Halbwellen besteht und der erzeugende Ausgang deshalb doppelt so schnell angesteuert werden muss. Hier die passende Erweiterung die den Pin5 oder PB0 ansteuert:
    Code:
    #include <avr/io.h>
    #include <avr/interrupt.h>
    
    ISR(TIM0_COMPA_vect)
    {
    	// PB0 einlesen und invertiert wieder ausgeben
    	if(PINB & (1<<PB0)) PORTB &= ~(1<<PB0); else PORTB |= (1<<PB0);
    }
    
    int main(void)
    {
    	TCCR0A = (0 << WGM00) | (1 << WGM01); // CTC-Mode
    	TCCR0A |= (0 << COM0A0) | (0 << COM0A1); // ohne OCR-Pin
    	TCCR0B = (0 << CS02) | (0 << CS01) | (1 << CS00); // kein prescaler!
    	TIMSK0 = (1 << OCIE0A); // Interrupt ein
    	OCR0A = 9600/72; // 9,6MHz/72kHz = 133,3
    	sei();
    
    	DDRB |= (1<<PB0); // PB0/Pin5 als Ausgang betreiben
    	while(1)
    	{
    	}
    	return(0);
    }
    (ungetestet)

    Bei der PWM-Betriebsart, wie beim asuro, läuft der Timer von 0 bis 255 und startet dann wieder bei 0. Die Periodendauer wird über das OCRx-Register erzeugt. Immer wenn der Zählerwert dem Inhalt dieses Registers entspricht wird der OCx-Ausgang des Timers geschaltet. Details werden über die Parametrierung des Timers eingestellt. Beim asuro wird der Ausgang immer gesetzt wenn der Timer nach dem Überlauf bei 0 neu startet, wenn OCRx erreicht wird, wird der Ausgang wieder ausgeschaltet. Dadurch werden pro Timerdurchlauf beide Periodenhäflten erzeugt. Ein Durchlauf dauert 8MHz/36kHz=222 Takte, jede Halbwelle also ca. 111 Takte. Für ein symetrisches Signal muss der Ausschaltpunkt deshalb 111 Takte vor dem Überlauf sein, deshalb wird das OCRx-Register mit 256-111=145 oder 0x91 geladen.

    Nun muss man noch die Takte pro Periode von 256 auf 222 kürzen. Da der Timer beim Überlauf nach 0 springt und erst dann die Überlauf-ISR aufgerufen wird, kann man hier den Zählerstand manipulieren. Das Zählregister des Timers muss um die zuvielen Takte erhöht werden. Dazu wird der aktuelle Zählerstand eingelesen, die Korrektur dazugerechnet und alles zusammen wieder in das Zählregister zurückgeschrieben. Der Korrekturwert errechnet sich aus der Differenz von 222 zu 256 und zusätzlichen(!) 3 Takten fürs Laden, Rechnen und Zurückschreiben: 256-222+3=37 oder 0x25. Deshalb findet man in der asuro-Lib in der ISR folgende Zeile:

    TNCT2 += 0x25;

    Beim Tiny mit 9,6MHz klappt das nicht so einfach: 9600000/36000=266. Leider zuviel für den 8-Bit-Timer.

    Gruß

    mic
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

Ähnliche Themen

  1. Problem mit 32kHz Uhrenquarz am timer1
    Von FeiaDragon im Forum PIC Controller
    Antworten: 6
    Letzter Beitrag: 29.08.2008, 22:03

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test