Die Utils Library enthält allgemeine Funktionen.
Mit dem BIT() Makro kann man IO Ports einen Namen geben und anschließend direkt ansprechen. Dies geschieht mit Defines, die man am besten in der config.h unterbringen kann. Zum Beispiel
/*----------------------------------- * Define your IO here * Examples for LED at PORTD.0 and switch at PIND.1 * #define LED1 BIT(PORTD, 0) * #define SWITCH1 BIT(PIND, 1) *----------------------------------*/ #define LED1 BIT(PORTD,1) #define LED2 BIT(PORTD,2) #define LED3 BIT(PORTD,3) #define TASTER1 BIT(PIND,4) #define TASTER2 BIT(PIND,5) #define TASTER3 BIT(PIND,6)
Man kann diese Definitionen ganz einfach anwenden.
LED1=0; LED2=1; while(TASTER1) { LED3=TASTER2; }
#define LINE_END 0 // 0=UNIX='\n', 1=MAC='\r', WIN='\r\n'
LINE_END definiert, welches Zeilenende Zeichen gesendet werden soll. 0 sendet ein \n, 1 sendet ein \r und 2 sendet ein \r\n.
void write(void (*f)(char), const char *s );
Die Funktion write() sendet einen String an eine Funktion. Diese Funktion muss in der Lage sein einzelne Bytes zu empfangen. Anwendungsbeispiele sind zb das Senden von Daten an den USART oder das Schreiben auf ein Display.
void writeln(void (*f)(char), const char *s );
Die Funktion writeln() entspricht der Funktion write(), aber der String wird mit einem \n (Newline), einem \r (Carridge Return) oder \r\n abgeschlossen. Welches Zeichen gesendet wird definiert LINE_END
void write_p(void (*f)(char), const char *progmem_s ); void writeln_p(void (*f)(char), const char *progmem_s );
Die Funktionen write_p() und writeln_p() entsprechen write() und writeln(), nur das der String aus dem Programmspeicher gelesen wird.
Beispiel
write (lcd_putc, "Hallo Welt!"); //Sendet den String an das Display write (usart_putc, "Hello World!"); //Sendet den String an den USART
Ein einfaches Beispiel soll die Funktion des BIT() Makro verdeutlichen. Das Beispiel ist in dem Download Archiv enthalten
#include <avr/io.h> #include <utils.h> int main(void) { DDRB=(1<<PB0); /* Set PB0 as Output for LED1 */ PORTB=(1<<PB1); /* Enable internal pullup for TASTER1 */ for (;;) /* loop forever */ { LED1=~(TASTER1); } }
Die config.h enthält zwei Einträge.
/* * Utils Defines */ #define LED1 BIT(PORTB,0) #define TASTER1 BIT(PINB,1)
Der Schaltplan für dieses Beispiel sieht so aus:
Aufgebaut auf einem Mega32 Prototype Board könnte das in etwa so aussehen:
Diskussion
Wowza, problem solved like it never hapeepnd.