Hallo,
ich bin nach etlichen Jahren Abstinenz wieder zum MCU Programmieren gekommen.
Ich habe die letzten Jahre vorwiegend Elektronikschaltungen entwickelt und programmieren "lassen".
Früher habe ich selber meistens mit Microchip und in Assembler gearbeitet, leider nur wenig mit den Atmels und dem AVR Studio 4.
Leider habe ich meine C Kenntnisse nie so wirklich gepflegt bzw. ausgebaut (ich hatte ja einen Programmierer).
Jetzt wollte ich das nachholen und habe mir das Atmelstudio6 zugelegt.
Leider sieht das alles etwas ungewohnt aus und ich komme nicht wirklich voran.
Ich wollte für ein kleines Heimprojekt (Haus Bus zum Üben) eine „minimale“ Kommunikation über eine RS485 Hardware realisieren.
Als MCU habe ich mir den ATMega64 ausgeguckt, und schon ein klein wenig Code geschrieben.
Da ich noch keine Hardware zum Üben habe wollte ich das mal mit dem Simulator durchtesten.
Ich komme aber nie in die ISR (der Breakpoint wird nie erreicht).
Den Registereintrag RXC0 kann ich zwar setzen, aber zur ISR führt das nicht.
Was mache ich falsch? Geht das überhaupt?
Das UDR0 kann ich auch nicht beschreiben um dort etwas zu sehen.
Über Hilfe würde ich mich freuen.
Bitte aber berücksichtigen, dass ich mit C üblichen Vorgehensweisen noch nicht so vertraut bin.
Code:
#include <avr/io.h>
#include <avr/iom64.h>
#include <stdio.h>
#include <avr/interrupt.h>
/* F_CPU = 16000000UL MCU Frequenz 16MHz externes Quarz
global gesetzt unter AVR/GNU C Compiler - Symbols*/
#define USART_BAUD_RATE 9600 //gewünschte Baudrate
#define USART_BAUD_CALC (F_CPU/(USART_BAUD_RATE*16L)-1) //berechnet Registerwerte für Baudrate
#define LOW(x) ((x) & 0xFF) //LOW-Byte
#define HIGH(x) (((x) >> 8) & 0xFF) //HIGH-Byte
volatile uint8_t data=0x00; //nur zum Anschauen im Watch
ISR (USART0_RX_vect) //Interrupt wenn empfang abgeschlossen
{
data=UDR0;
UDR0=data;
}
int main(void)
{
DDRA=0b00000000;
DDRB=0b11111111;
DDRC=0b11111111;
DDRD=0b10111011;
DDRE=0b10111110;
DDRF=0b11111111;
DDRG=0b11111;
UBRR0H = HIGH(USART_BAUD_CALC); //Setzen des HIGH-Byte vom USART-Register für Baudrate
UBRR0L = LOW (USART_BAUD_CALC); //Setzen des LOW-Byte vom USART-Register für Baudrate
UCSR0B = (1<<RXEN0) | (1<<TXEN0) | (1<RXCIE0); //Empfangen, Senden und Empfangsinterrupt aktivieren
UCSR0A = (1<<MPCM0); //Bit zur "SLAVE" Kennzeichnung !/nur Adressen ansehen, Daten ignorieren
//Codierungsbits abfragen und RRS485-ID Adressierung festlegen
sei(); //Interruptfreigabe
while(1)
{
PORTG =0b10101; //setzt Port G Bitmuster nurm zum Anschauen im IO View
PORTG ^=(1<<PG1); //toggelt Port G Bit 1
}
}
Lesezeichen