PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 2-Timerprobleme kann ich nicht lösen(Attiny13 o.ä)



oderlachs
15.02.2014, 11:47
Es ist bestimmt hier schon jede Menge über Timer in AVR geschrieben bzw diskutiert worden, aber irgendwie habe ich wieder das gewisse Brett vorm Kopf.
Ich muss zugeben ich habe in dieser Sache noch nicht genug Erfahrung beim Programmieren in C (event. ASM o. Bascom(bevz)).

Mein Problem ist folgendes, ich möchte eine kleine Sache mit einem Attiny 45 o.ä. jedenfalls einem 8-Füssler lösen.
Natürlich nur, wenn möglich !
Ich benötige 2 x Input 2x Output. ein Eingang zum Auslösen. ein Eingang zum Stoppen...ein Ausgang LED , ein Ausgang Speaker...

Die Aufgabe besteht darin das wenn ein Eingang auf HIGH( oder auch LOW) geht soll der Speakerausgang für 30..60sec.(einstellbar) alle 2..3sec. einen Piepton ausgeben.
Das soll aber auf vorzeitig auch zu Stoppen gehen.

Kann mir wer helfen wie ich die Sache angehen kann, ein paar Codehinweise genügen, muss nicht Fertiges sein. Ich will ja dabei lernen und nicht nur "abkupfern" ;)

Gruss und Dank

Gerhard
Nachtrag: Natürlich mit Attiny45, denn der 13er hat nur einen Timer :(

Michael
15.02.2014, 13:53
ein Timer würde sicher genügen.
Den lässt du einfach im doppeltem Sound-Takt laufen.
Im Hauptprogramm fragst du deine Eingänge ab und setzt die Ausgänge und, falls erforderlich, setzt du eine Variable mit der Anzahl Sound-Takte entsprechend der maximalen Dauer.
Im Interrupt fragst du diese Variable ab und wenn sie größer Null ist, dann toggelst du den Sound-Ausgang und zählst eins runter.
Gleichzeitig checkst du mit einer 2. Variable, ob grad deine 2..3sec vorbei sind und handelst entsprechend.

Ein Tiny13 reicht dann nach meinem Gefühl, der hat ja 5 I/Os.

Gruß, Michael

oderlachs
15.02.2014, 14:24
Danke Michael !
Ich grübel mir nun schon den Kopf wund, wie ich das mit dem Timing machen soll, ich sage ja ich bin da fast Neueinsteiger in Sachen Timer,PWm, Interruppt.
Ich habe jetzt erst mal folgenden Code:


#include <avr/interrupt.h>
#include <stdint.h>
// ATTiny13
// F_CPU 4800000Hz intern
// PIN B4 = LED Ausgang
// PIN B2 = LED Anzeige Überlauf Timer
// PIN B3 INPUT LOW oder HIGH
volatile int timer_overflow_count = 0;
uint8_t FLAG = 1;
ISR(TIM0_OVF_vect)
{
if (++timer_overflow_count >18)
//(4800000 /(255x1024x18)
{
// Toggle Port B Pin 2 output status
PORTB ^= 1<<PB2; // LED blinkt in ca. 1sec. Abstand etwa...
// FLAG != FLAG;
timer_overflow_count = 0;
}
}

int main(void) {
// Set up Port B pin 2 mode to output
DDRB = 1<<DDB2;

// prescale timer to 1/1024th the clock rate
// = 4867.5 Hz bei 4,8MHz
TCCR0B |= (1<<CS02) | (1<<CS00);
// prescale timer to 1/8th the clock rate
//TCCR0B |= (1<<CS01);

// enable timer overflow interrupt
TIMSK0 |=1<<TOIE0;
sei();

while(1) {

// ISR handle the LED forever
}
}



Damit habe ich etwas das Timing verstanden zu kapieren...nun müsste der Takt aber nicht 255 x ablaufen bis zum Überlauf, sondern nur noch 200. Gibt es nicht eine Methode, wo ich den Zähler schon auf 55 voreinstellen kann , so das nur noch 200 Takte bis zum Überlauf gebraucht werden ??
Ich lesen das Datenblatt jetzt schon mehr mals rauf und runter , kann es nicht finden... :(
Dies muss ich erst mal kapieren , ehe ich mich mit dem Weiteren befassen kann...

Gruss und Dank

Gerhard

Michael
15.02.2014, 16:17
C ist mir zu kryptisch, das tu ich mir nicht an, ich mag lieber klare Sprachen wie Basic, Pascal oder Assembler ;)
Kannst du den Timer nicht beim Einsprung in den Interrupt auf den gewünschten Wert 56 setzen? Dann läuft er nur noch 200 Takte bis zum nächstem Überlauf.

Gruß, Michael

oderlachs
15.02.2014, 17:00
Danke Michael...
Ich habe es schon geschafft nach dem Überlauf lade ich den TNTC0 mit 56 vor und schon geht das, wieder was dazu gelernt :)

// vorladen des Zählers
TCNT0 =0x38; // 56 dec.


Nun muss ich mir noch ausdenken, wie ich Deinen Vorschlag realisiere, mit doppelter Soundfrequenz usw....

Gruss und Dank
Gerhard

robin
15.02.2014, 17:08
schau mal ins datenblatt, du kannst den Timer im CTC modus laufen lassen, dann zählt er nur bis er den wert in OCR0A erreicht.

Kapitel 11.7.2
http://www.atmel.com/images/doc2535.pdf

oderlachs
16.02.2014, 11:52
Danke Robin !

ich habe gerade hier ein "Fachbuch" vom ATMega32 da wird so einiges von den Timern usw. beschrieben, an Hand dessen werde ich mich mal in die Timerprogrammierung "einwühlen"..
Ja ich habe das Datenblatt vom ATTiny13 schon durchstöbert um einige Fakten zu erfahren, aber wie gesagt in Sachen Timer/PWM unter C oder Basic, ASM bin ich noch ein "Erstklässler".. ;)

Gruss und Dank

Gerhard

derNeue
16.02.2014, 17:59
Hallo Oderlachs!

Vielleicht hilft dir der Link, ist mMn gut geschrieben.

http://www.mikrocontroller.net/articles/FAQ#Timer


Ist ansich gar nicht so schwer, mit den Timern.

Mich wundert etwas, interner Quarz mit 4,8MHz? Sind die nicht immer genau 4MHz? Oder ist das beim Attiny13 anders?


Dennis

oberallgeier
16.02.2014, 18:17
... Mich wundert ... interner Quarz mit 4,8MHz? ... nicht immer genau 4MHz? ... ist das beim Attiny13 ander2 ...Der tiny13 IST anders. Normalerweise hat der interne Oszillator (es ist KEIN interner Quarz) bei den Atmels 8 MHz, mit nem 1/8-tel Vorteiler im Lieferzustand werden das die sattsam bekannten 1 MHz - ohne Quarz, ohne Fuses, eben fabrikneu. Der Tiny hat seit jeher seinen internen Oszillator mit 9,6 MHz bzw 4,8 MHz, mit dem 8tel Vorteiler werden es 1,2 MHz. Der tiny13 hat aber mit einem zusätzlichen internen Oszillator zusätzlich noch die Möglichkeit mit dem Internal 128 kHz Oscillator extrem sparsamen zu takten - ohne zusätzliches Bauteil. Unabhängig davon kann er mit entsprechendem Quarz ab 2,7V mit bis zu 10 MHz und ab 4,5V mit bis zu 20 MHz getaktet werden. Ein pfiffiges Dingelchen !

derNeue
17.02.2014, 16:05
Der tiny13 IST anders.

Ah, okay, speziell mit dem Attiny13 habe ich jetzt noch nix gemacht. Der kleinste bisher war der Attiny24, ansonsten nur Megas.


Dennis