PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : erste Versuche mit Timer



MSP430start
30.06.2009, 23:01
Hallo,

ich habe jetzt mal angefangen mit dem Timer1 von einem mega32 zu spielen.

ich möchte für den Anfang erstmal ohne Interrupt oder sonstiges messen wie lange eine Taste gedrückt ist.


if ( PIND&(0x04) )
{
PORTD |= 0x40; //signal LED ein

TCCR1A = 0x00;
TCCR1B |= (1<<CS12)|(1<<CS10); //timer starten
_delay_ms(20); //entprellen
while (PIND&(0x04)); //warten bis Taste losgelassen
TCCR1B &= ( (~(1<<CS12)) | (~(1<<CS10)) ); //timer stoppen
//Wert speichern
temp1= TCNT1L;
temp2 = TCNT1H;
counter = (temp2<<8)+temp1;

//zählregister auf 0 zurück setzen
TCNT1H = 0x00;
TCNT1L = 0x00;

//Ausgang abschalten
PORTD &= 0xdf;
}

die Variable counter gebe cih danach auf einem LCD aus, die Werte die ich da bekomme sind nur leider bedingt richtig denke ich, weil ich teilweise negative Zahlen ausgegeben bekomme oder auch gerade bei kurzen Tastimpulsen schon recht große Werte.

Der Controller ist auf intern 1MHz eingestellt und mit dem Prescaler hab ich jetzt quasi doch eine Erhöhung des Timerregisters alle 1,024ms oder nicht?

yaro
30.06.2009, 23:33
Poste mal deinen ganzen Code rein, vor allem den, in dem du deine Variablen deklarierst.

Gruß, Yaro

MSP430start
30.06.2009, 23:51
die lcd-routinen lasse ich mal weg:


#include <avr/io.h>
#include <stdlib.h>
#include "lcd-routines.h"
#include <util/delay.h>



int main(void)
{

int counter=0;
int temp1, temp2;
DDRD = 0xf0;

lcd_init();

while(1)
{

if ( PIND&(0x04) )
{
PORTD |= 0x40; //signal LED ein

TCCR1A = 0x00;
TCCR1B |= (1<<CS12)|(1<<CS10); //timer starten
_delay_ms(20);
while (PIND&(0x04));
TCCR1B &= ( (~(1<<CS12)) | (~(1<<CS10)) ); //timer stoppen

temp1= TCNT1L;
temp2 = TCNT1H;
counter = (temp2<<8)+temp1;

//zählregister auf 0 zurück setzen
TCNT1H = 0x00;
TCNT1L = 0x00;

//Ausgang abschalten
PORTD &= 0xdf;
}

{
char Buffer[16]; // in diesem {} lokal
lcd_clear();

set_cursor(0,2);
itoa( counter, Buffer, 10 );

// ... ausgeben
lcd_string( Buffer );
_delay_ms(200);

}

}

return 0;
}

Babbage
01.07.2009, 11:37
Sieht jetzt mal nicht so falsch aus. counter kann zwar negativ werden aber erst bei Werten über 32767.
Das entspräche 30s Tastendruck.

Ist der Timer1 sonst unbenutzt, mit was für einem Timer läuft dann _delay_ms ? Oder braucht evtl die LCD Ansteuerung einen Timer?

p_mork
01.07.2009, 13:16
Das Problem wird wohl die Zeile

TCCR1B &= ( (~(1<<CS12)) | (~(1<<CS10)) ); //timer stoppen sein.

( (~(1<<CS12)) | (~(1<<CS10)) ) ist nämlich konstant 0b11111111, sprich der gesamte Ausdruck hat keinerlei Wirkung und Timer1 läuft weiter. Mir scheint es, dass Du dich mit binären Verknüpfungen noch nicht besonders gut auskennst. Auf www.mikrocontroller.net/articles/Bitmanipulation ist das genau beschrieben.

MfG Mark

Babbage
01.07.2009, 13:27
lol, total übersehen

MSP430start
01.07.2009, 14:31
danke

TCCR1B &= ~( (1<<CS12) | (1<<CS10) );
hat jetzt das Problem gelöst