Also das mit dem Umwandeln hab ich soweit hingekriegt...mein Programm sendet mir auch immer meinen Wert an den PC wenn ich den 2ten Taster druecke...leider funktioniert mein Timer in dem Programm nicht mehr...hab in der ISR die LED eingebaut die doch eigentlich im sekundentakt blinken muesste...warum läuft denn mein Timer nicht mehr...hier mein Programm:
Vielen Dank und viele Gruesse
Code:
//define all external dependencies
#include <avr/io.h>
#include <util/delay.h>
#include <stdio.h>
#include <stdint.h>
#include <avr/interrupt.h>
//-------------------------------------------------------------------------------------------------//
#ifndef F_CPU
#warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 4000000"
#define F_CPU 3686400 // Systemtakt in Hz - Definition als unsigned long beachten
#endif
#define BAUD 9600UL // Baudrate, das L am Ende ist wichtig, NICHT UL verwenden!
// Berechnungen
#define UBRR_VAL (((F_CPU)/(BAUD*16))-1) // clever runden
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1))) // Reale Baudrate
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD-1000) // Fehler in Promille
//#if ((BAUD_ERROR>10) || (BAUD_ERROR<=10))
//#error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch!
//#endif
//-------------------------------------------------------------------------------------------------//
//declare all used functions
void Sensor_init(void);
void LED_SW_init(void);
void uart_init(void);
void TIMER2_interrupt_init(void);
//define variables
volatile unsigned int z = 0;
volatile unsigned int sekunde =0;
void sendString(char* string, int length) {
for (int c=0; c<length; c++) {
while (!(UCSRA & (1<<UDRE))) // warten bis Senden moeglich
{
}
UDR = string[c];
}
}
void uart_init(void)
{
UCSRB |= (1<<TXEN); // UART TX einschalten
UCSRC |= (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); // Asynchron 8N1
UBRRH = UBRR_VAL >> 8;
UBRRL = UBRR_VAL & 0xFF;
}
void TIMER2_interrupt_init(void)
{
TCCR2 = (1<<WGM21)|(0<<WGM20)|(1<<CS22)| (1<<CS21) |(0<<CS20); //CTC mode und Prescaler auf 256
TCNT2=0;
OCR2=199; //alle 0.008 s Interrupt
TIMSK = (1<<OCIE2);
}
ISR(TIMER2_COMP_vect) //LED soll alle 1s leuchten
{
z++;
if(z==72)
{
PORTB ^= (1<<PB0);
sekunde++;
z=0;
}
}
int main(void)
{
Sensor_init();
LED_SW_init();
uart_init();
TIMER2_interrupt_init();
int T1=0;
int T2=0;
int TD=0;
char myTestString[20]; // char-Array deklarieren
while(1)
{
if(!(PINA & (1<<PINA0))) //Mit Pin 0 soll T1 gespeichert werden
{
T1 = sekunde;
}
if(!(PINA & (1<<PINA1))) //Mit Pin 1 soll T2 gespeichert werden und die Differenz berechnet werden
{
T2 = sekunde;
TD = T2-T1;
sprintf(myTestString, "Zeit %d ", TD); // String formatieren
sendString(myTestString, 10); // String schicken
}
}
}
void Sensor_init(){
DDRA=0x00; // For using the floating sensor the Port A has to be used as a digital input
PORTA=0xff; // activate internal pull-up resistors for PORTA
}
void LED_SW_init(){
DDRB=0xFF; // PORTB is output for LEDs
PORTB=0xFF; // all LEDs off
}
Lesezeichen