Hallo,
Ich möchte gerne auf einem Arduino H7 eine 9 Bit Uart Kommunikation nutzen.
Aktuell nutze ich zum testen einen Nano, der dafür <util/setbaud.h> nutzt. Dies unterstützt der H7 aber leider nicht.
Ich habe bereits gegoogelt etc., habe aber nichts finden können.
Eventuell habt Ihr eine Lösung.
Hier der Code vom Nano:
#define BAUD 9600
#include <Wire.h>
#include <util/setbaud.h>
#include <LiquidCrystal_I2C.h>
long Rx_T; // Read time
unsigned long Rx_Fail;
LiquidCrystal_I2C lcd(0x27,16,2); //LCD 16 zeichen, 2 reihen
void setup() {
//Anleitung:
//https://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Der_UART
// Baut rate setzen
UBRR0H = UBRRH_VALUE;
UBRR0L = UBRRL_VALUE;
// Asynchronen Modus
UCSR0A &= ~(1 << U2X0);
// Set async, no parity, 1 stop, 9bit
UCSR0C = (0<<UMSEL01)|(0<<UMSEL00)|(0<<UPM01)|(0<<UPM00)|(0<<USBS0)|(1<<UCSZ01)|(1<<UCSZ00);
UCSR0B |= (1<<UCSZ02); // 9bit
// Aktivieren rx/tx
UCSR0B |= (1<<RXEN0)|(1<<TXEN0);
lcd.init();
lcd.backlight(); //Beleuchtung an
lcd.print("Neustart"); //Reihe 1
lcd.setCursor(0,1); //Reihe 2
lcd.print("Neustart");
}
void loop() {
// Senden
Send();
// Empfangen
Rx_T=Empfangen();
if (Rx_T>0){
lcd.clear();
lcd.print("Rx_T: ");
lcd.print(Rx_T);
lcd.setCursor(0,1);
lcd.print("Fail: ");
lcd.print(Rx_Fail);
Rx_Fail=0;
} else {
Rx_Fail+=1;
}
delay (100);
}
void Send(){
// Senden / Anfrage
// Adresse Senden
// Warten bis senden möglich ist
while ( !( UCSR0A & (1<<UDRE0)));
// Ein bit 9 (Adresse)
UCSR0B |= (1<<TXB80);
// (Adresse)
UDR0 = 0x0B; // 0x08:Münzer + 0x03:Poll
// Checksumme
// Warten bis senden möglich ist
while ( !( UCSR0A & (1<<UDRE0)));
// Aus bit 9 (Daten)
UCSR0B &= ~(1<<TXB80);
// Checksumme
UDR0 = 0x0B;
}
long Empfangen (){
long Time_Left = 0;
unsigned long Start_T = millis();
// Empfangen
// Warten bis senden möglich ist
do {
//Prüfen ob Empfangszeit überschritten wird
Time_Left=millis()-Start_T;
if (Time_Left>10){
return (Time_Left*-1);
}
//if (Time_Left > 10000) return -Time_Left;
//Time_Left += 1;
} while (!(UCSR0A & (1<<RXC0))); // Keine Neue Nachricht
// Etwas emnpfangen...
byte temp;
temp = UDR0; // Daten Abholen...
return Time_Left;
}
Über "UCSR0B" wird dann das Bit 9 gesetzt / ausgelesen...
// Ein bit 9 (Adresse)
UCSR0B |= (1<<TXB80);
// Aus bit 9 (Daten)
UCSR0B &= ~(1<<TXB80);