Hallo Ihr freundlichen Ratgeber,
nun habe ich angefangen mit C . (Anmerkung, nicht zum Lesen gedacht: ich bin SEHR zweckorientiert gewesen, habe mir die Anleitung zu C im Asuro durchgelesen, die Tutorials in RN und mikrocontroller.net und den einen oder anderen Codeschnippsel in der AVR-Doku und habe vorerst DOCH mit AVR-Studio/WinAVR angefangen - weil mir meine eigene Zeitplanung zu meinem eigenen Roboterprojekt im Nacken sitzt). Folgende Vorarbeiten:
1) Ein kleines Flashboard für den tiny2313 gebaut, mit je einer seitlichen Steckleiste am Controller
2) ... mit einem max232 (man will ja kommunizieren)
Der Test der selbstgebauten und beschafften Ausrüstung mit Assemblerroutinen z.B. zur Servoansteuerung geht ok. Da habe ich aber nix mit RS232 gemacht, klar. PonyProg 2.07a Beta und RN-ISP-Programmierkabel (ISP Dongle). Geht alles wirklich prima.
Ein kleines C-Programm geschrieben. Es sollte ja wirklich klein sein - "Hallo Welt" und eine LED auf PB2 anzünden.
Code:
/*
===========================================================
Aufgabe:
Sende "Hallo Welt" über die RS232 UND
LED auf PB2 anzünden
Autor: JWT
===========================================================
*/
#include <stdlib.h>
#include <avr/io.h>
/* #include <avr/iotn2313.h> <<< das is ja wohl nix */
#define MCU = attiny2313
// ### NEIN ### Mit Quarz 16 Mhz-CPU
// Interner Oszillator, 8 MHz
#define F_CPU = 8000000
// ### Portinitialisierung und waitms aus RNContr Demo C
// *### Ports setzen ###
// Ports auf HIGH/LOW setzen
static inline void setportbon(const uint8_t n)
{PORTB |= (1<<n);} //set PORTB.n high
static inline void setportboff(const uint8_t n)
{PORTB &= ~(1<<n);} //set PORTB.n low
/*### Programm pausieren lassen ###*/
/*Pausenwert ist nur experimentell !*/
void waitms(uint16_t ms)
{
for(; ms>0; ms--)
{
uint16_t __c = 4000;
__asm__ volatile (
"1: sbiw %0,1" "\n\t"
"brne 1b"
: "=w" (__c)
: "0" (__c)
);
}
}
// ------------------------------------------------------------------
// Dieser Codeschnipsel ähnlich 2313-doc, S 121
void USART_Init( unsigned int baud )
{
/* Set baud rate */
UBRRH = (unsigned char)(baud>>8);
UBRRL = (unsigned char)baud;
/* Enable receiver and transmitter */
UCSRB = (1<<RXEN)|(1<<TXEN);
/* Set frame format: 8data, 2stop bit */
UCSRC = (1<<USBS)|(3<<UCSZ0);
}
// ------------------------------------------------------------------
void sendchar(unsigned char c)
{
while(!(UCSRA & (1<<UDRE))) //Warten, bis Senden möglich ist
{
}
UDR = c; //schreibt das Zeichen aus 'c' auf die Schnittstelle
}
// ------------------------------------------------------------------
void sendUSART(char *s) //*s funktiniert wie eine Art Array - auch bei
// einem String werden die Zeichen (char)
// einzeln ausgelesen - und auf die
// Sendeschnittstelle übertragen
{
while(*s)
{
sendchar(*s);
s++;
}
}
// ------------------------------------------------------------------
/*### Hauptschleife ###*/
int main(void)
{
// for(uint8_t i=0; i<10; i++)
{
setportboff(2);
waitms(150);
setportbon(2);
}
USART_Init(9600); //USART initialisieren
/*###Text senden###*/
sendUSART("\r\n\n\n"); //Sendet Kenung und Text.
// "\r" setze Cursor auf Zeilenanfang,
// "\n" beginnt dann die nächste Zeile
sendUSART("**** ATtiny2313 *****\r\n");
sendUSART(" \r\n");
sendUSART("Hallo, Welt.\r\n");
sendUSART(" \r\n");
}
Nach einigen Mühen war der Code fertig. Die Mühen bestanden in Anpassungen an Fehlermeldungen des Compilers (AVRStudio aStudio4b528.exe mit SP 1 und WinAVR-20070525-install.exe).
Hmmm, ja, das wars dann. Der Code freut den Compiler beim Compilieren, der Maschinencode freut Ponyprog beim Flashen (Klartext - alles ohne Fehlermeldungen, nur ok-Meldungen) - aber die Reaktion der LED ist null - ebenso wie das Hyperterminal. Meine Hauptängste waren, dass die RS232 nicht läuft - aber dass nicht mal die LED mit C anzuzünden ist beschämt mich doch.
Ein Test der RS232-Verbindung zum PC mit der RN-Control 1.4 bringt die erwarteten Meldungen aufs Hyperterminal. Ich will nicht gleich den Mega32 umprogrammieren - sondern beim tiny2313 weitermachen, den habe ich ja auch mit Assembler schon etwas "im Griff" und er hat einen festen Posten im Projekt.
Kann bitte jemand sagen was an meinem ersten C-Programm falsch ist?
Lesezeichen