Hallo HaWe,
ich habe mich gleich ans Werk gemacht und den Code gekürzt das verhalten ist noch 1:1 das gleiche.
Schon mal vielen Dank, dass du dir den Quellcode an siehst und mir hilfst.
Code:
#define MCU atmega8
#define F_CPU 2000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <inttypes.h>
#include <stdlib.h>
#include <stdio.h>
#include "USART_RS232_H_file.h" /* include USART library */
#define BT_EN_REGISTER DDRC
#define BT_EN_PORT PORTC
#define BT_EN_PIN PC0
#define LED_REGISTER DDRC
#define LED_PORT PORTC
#define LED_RED_PIN PC5
#define LED_GREEN_PIN PC4
#define LED_BLUE_PIN PC3
//Data from App
long pl_valid_time_sec = 0;
uint8_t uart_getc(void){
while (!(UCSRA & (1<<RXC))){} // warten bis Zeichen verfuegbar
return UDR; // Zeichen aus UDR an Aufrufer zurueckgeben
}
void uart_gets( char* Buffer, uint32_t MaxLen){
uint8_t NextChar;
uint32_t StringLen = 0;
NextChar = uart_getc(); // Warte auf und empfange das nächste Zeichen
while( NextChar != '\n' && StringLen < MaxLen - 1 ) { // Sammle solange Zeichen, bis: entweder das String Ende Zeichen kam oder das aufnehmende Array voll ist
*Buffer++ = NextChar;
StringLen++;
NextChar = uart_getc();
}
*Buffer = '\0'; // Noch ein '\0' anhängen um einen Standard C-String daraus zu machen
}
void get_BTData(char mode){
char uart_buffer[512];
for(int i=0; i<4; i++){
LED_PORT ^= (1 << LED_BLUE_PIN);
_delay_ms(500);
}
USART_Init(9600); /* initialize USART with 9600 baud rate */
LED_PORT |= (1<<LED_BLUE_PIN);
uart_gets(uart_buffer,512);
char spl_buffer[512];
spl_buffer[0] = '1'; spl_buffer[1] = '2'; spl_buffer[1] = '\0';
pl_valid_time_sec = atol(spl_buffer);
_delay_ms(5000);
LED_PORT &= ~(1<<LED_BLUE_PIN);
}
int main(void){
// Direction Registers
DDRB = 0x00; // B as input
DDRC = 0x00; // D as Input
DDRD = 0x00; // D as Input
// Set Output Registers
BT_EN_REGISTER |= (1 << BT_EN_PIN); // Bluetooth PWR Controll
LED_REGISTER |= (1 << LED_RED_PIN); // LED as output
LED_REGISTER |= (1 << LED_GREEN_PIN); // LED as output
LED_REGISTER |= (1 << LED_BLUE_PIN); // LED as output
// Ports to LOW (GND no Pullup)
PORTB = 0x00;
PORTC = 0x00;
PORTD = 0x00;
for (int i=0; i < 4; i++){
LED_PORT ^= (1 << LED_GREEN_PIN);
_delay_ms(500);
}
get_BTData('I'); // INIT MODE
while(1){
LED_PORT ^= (1 << LED_RED_PIN);
_delay_ms(500);
}
}
Wenn ich wüsste was hier bei der Lib an BAUD steht, könnte ich die ganze Lib auch noch ausbauen
Der ATMEGA läuft bei 2Mhz
Code:
void USART_Init(unsigned long BAUDRATE) /* USART initialize function */
{
UCSRB |= (1 << RXEN) | (1 << TXEN); /* Enable USART transmitter and receiver */
UCSRC |= (1 << URSEL)| (1 << UCSZ0) | (1 << UCSZ1); /* Write USCRC for 8 bit data and 1 stop bit */
UBRRL = BAUD_PRESCALE; /* Load UBRRL with lower 8 bit of prescale value */
UBRRH = (BAUD_PRESCALE >> 8); /* Load UBRRH with upper 8 bit of prescale value */
}
Lesezeichen