Projekte
BirgerT
nibo2_Birger_01
blib_utils.h
Projekte
Forum
Doku
Öffentliche Projekte
Startseite
Beispielprogramme
Projekte von anderen
Welcome
Username
Passwort
Eingeloggt bleiben
Zugangsdaten vergessen?
Registrieren
Projektverwaltung
⇨ Please choose! ⇦
——————————————————
✎ Create new project...
★ Browse existing projects...
——————————————————
⚬ MotorTest#1
⚬ C Tutorial 8#1
⚬ NIBO2 C Project#1
⚙ C Tutorial 15#1
⚬ 2010_11_18_el_test001#1
nibo2_Birger_01
blib_utils.c
blib_utils.h
BSD_license.h
nibo2_global.h
nibo2_main.c
nibo2_main_01.h
nibo2_pwm_leds.c
nibo2_pwm_leds.h
nibo2_sensors.c
nibo2_sensors.h
Project details
Compiler settings
Nachrichten
Sie sind nicht eingeloggt.
Neuigkeiten
★
NiboRoboLib 3.6
2017-01-17: Neue Version 3.6
★
NiboRoboLib 3.4.1
2016-04-16: Neue Version 3.4.1
★
Coding Tutorial
2015-11-22: Jetzt auch für den NIBO burger!
Site-Statistic
7427 private projects
385 public projects
16181052 lines compiled
58220 builds
NIBO
@
nibo2_birger_1/blib_utils.h [read only]
////////////////////////////////////////////////////////////////////////// // // BT LIB UTILS == AVR MEGA Makros, Typdefs und allgem. Funktionen // // (c) Birger Töpelmann toepelmann(A)web.de Version 141101a // // Zum Testen der Funktionen, Programme, Speicherinhalte und Timings // von AT-Mega MCU im Zielsystem über die serielle Schnittstelle und // mit einem (VT100/ANSI) Terminalprogramm auf dem PC. // // // // TODO: - Typedefs // Word, Byte und Flags testen und Funktionen Updaten // // - Datei aufräumen // // ////////////////////////////////////////////////////////////////////////// // // BSD License see "BSD_license.h" // #include "BSD_license.h" // #ifndef _BTLIB_UTILS_H_ #define _BTLIB_UTILS_H_ // #ifdef __cplusplus extern "C" { #endif // BirgerT AVR MCU Bibliotheken (en Bloc in neue Programmodule übernehmen) // //#include "bt_lib_utils.h" // Sammlung von Makros und Typedefs //#include "bt_lib_uart.h" // UART Kommunikation mit FIFOs //#include "bt_lib_terminal.h" // Mensch Mikrocontroller Kommunikation //#include "bt_lib_debugutil.h" // Memory Dump, Laufzeitmessung // // ////////////////////////////////////////////////// notwendige Headerfiles ////////////////////////////////////////////////////////////////////////// // #include <stdlib.h> // Fließkommazahl in Zeichenkette #include <string.h> // Zeichenketten #include <stdio.h> // sprintf #include <stdarg.h> // va_list // ///////////////////////////////////////////////////////////// AVR Header // #include <avr/io.h> // ATmega128 /* in avr/io.h sind die Namen der Special Function Registers SFR definiert. Die Namen der SFR werden im AVR Studio auch im Fenster "I/O View" angezeigt. Die SFR sind alle als volatile (= flüchtig) Variablen (char, int) deklariert, d.h. dass die Lese- und Schreibzugriffe vom Compiler nicht wegoptimiert werden. Beim Setzen oder Löschen einzelner Bits muss man unterscheiden, ob das ganze Register (über-)schreibt, oder nur einzelne Bit. DDRC = 0xFF; // PORTC alle PINs als OUTPUT PORTC = 0x0F; // überschreibt setzt alle Bits in Port C // PORTC enthält Bitmuster 00001111 PORTC = 0xF0; // überschreibt setzt alle Bits in Port C // PORTC enthält Bitmuster 11110000 PORTC |= ((1<<PC2) | (1<<PC1); // zwei Bits setzen // PORTC enthält Bitmuster 11110110 PORTC &= ~((1<<PC5) | (1<<PC7)); // zwei Bits löschen // PORTC enthält Bitmuster 01010110 DDR.. ist das Data Direction Register (IN bei 0, Out bei 1) PORT. ist das Register zum Setzen der Ausgänge PIN.. dient zum Lesen der Eingabebits In ein als Eingang geschaltetes IO Bit eine 1 schreiben aktiviert den internen Pullup Widerstand - deaktivieren entsprechend mit 0. Beispiel für Taster an PIND4: DDRD &= ~(1<<PD4) // Löschen DDR Bit = Eingang PORTD |= (1<<PD4) // Setzen des Portbits = Pullup ein Eingänge mit Pullup sind im offenen Zustand 1, ein Kontakt (Taster) verbindet den Eingang mit GND -> Zustand 0 if(!(PIND & (1<<PIND4)) // SW3 wird gedrückt */ #include <avr/interrupt.h> // Interrupts #include <avr/pgmspace.h> // FLASH #include <avr/eeprom.h> // EEPROM #include <util/delay.h> // kurze Pausen // Verzögerung um us(max 48) Mikrosekunden // us = float Mikrosekunden #define delay_us(us) _delay_us(us) // //////////////////////////////////////////////////////// DEFINES & MAKROS ////////////////////////////////////////////////////////////////////////// // // ACHTUNG: // // Defines werden vom PreCompiler 1:1 in den Quelltext übersetzt, // d.h. ein '#define TESTWERT 5*20' wird nicht berechnet; // // if(wert == TESTWERT) -> ergibt if(wert == 5*20) // und NICHT if(wert == 100) // // die korrekte Definition von Wahr und Falsch? #define TRUE (1==1) #define FALSE (1==0) // #define NOP __asm volatile ("nop") // //////////////////////////////////////////////////////// BIT MANIPULATION // // ACHTUNG: // Bitnummer möglichst immer als Konstante übergeben, // bei Variablen werden die Bitpositionen im Programm berechnet. // // // SetBit(Port/Variable,BitNr) Bit #b in Variable p setzen =1 // #define SETBIT(p,b) (p) |= (uint8_t)(1<<b) // // ClrBit(Port/Variable,BitNr) Bit #b in Variable p loeschen =0 // #define CLRBIT(p,b) (p) &= ~(uint8_t)(1<<b) // // InvBit(Port/Variable,BitNr) Bit #b in Variable p toggeln/invertieren // #define INVBIT(p,b) (p) ^= (uint8_t)(1<<b) // // GetBit(Port/Char,BitNr) Bit #b in Variable p abfragen // Return 0 == Bit geloescht, Return 1 == Bit gesetzt // #define GETBIT(p,b) (uint8_t)(((p) >> (b)) & 1) // // TstBit(Port/Char,BitNr) Bit #b in Variable p abfragen // Return True == Bit ist gesetzt // #define TSTBIT(p,b) (( (p) & (uint8_t)(1 << (b))) !=0) // ////////////////////////////////////////////////////////// BYTES und WORDS // #define LOBYTE(x) (uint8_t)((uint16_t)x) #define HIBYTE(x) (uint8_t)(((uint16_t)x)>>8) #define TOWORD(hi,lo) ((hi*0x100)+lo) // //////////////////////////////////////////////////////////////// TYPEDEFS ////////////////////////////////////////////////////////////////////////// // // Bitfield Structs für Bytes und Words und zur Einzelbitabfrage // #if 0 typedef union { // ein Byte besteht aus.. uint8_t x; // .. zwei Nibbles a 4 Bit.. struct { uint8_t l :4; uint8_t h :4; } __attribute__((packed)); // ..sowie aus den 8 Bits struct { uint8_t b0 :1; uint8_t b1 :1; uint8_t b2 :1; uint8_t b3 :1; uint8_t b4 :1; uint8_t b5 :1; uint8_t b6 :1; uint8_t b7 :1; } __attribute__((packed)); } byte_t; // #define FLAG(f,n) (((volatile struct byte_t *)&f)->f##n) typedef union { // ein Word besteht aus.. uint16_t X; // ..zwei Bytes Low, High,.. struct { uint16_t L :8; uint16_t H :8; } __attribute__((packed)); // ..4 Nibbles LowLow..HighHigh struct { uint16_t LL :4; uint16_t LH :4; uint16_t HL :4; uint16_t HH :4; } __attribute__((packed)); // ..sowie aus den 16 Bits (Flags) struct { uint16_t F0 :1; uint16_t F1 :1; uint16_t F2 :1; uint16_t F3 :1; uint16_t F4 :1; uint16_t F5 :1; uint16_t F6 :1; uint16_t F7 :1; uint16_t F8 :1; uint16_t F9 :1; uint16_t Fa :1; uint16_t Fb :1; uint16_t Fc :1; uint16_t Fd :1; uint16_t Fe :1; uint16_t Ff :1; } __attribute__((packed)); } word_t; #endif // ////////////////////////////////////////////////////////////////////////// // // Zeiger auf eine Funktion definieren // typedef void(* fn_Pointer_t)(void); // // Funktionen sollen überZeiger aufgerufen werden // // func_to_call_1(){;} // func_to_call_2(){;} // func_to_call_3(){;} // // ein Array mit den Adressen der Funktionen // // fn_Pointer_t functions[] = { // &func_to_call_1, &func_to_call_2, &func_to_call_3, 0 }; // // der Funktionsaufruf // // uint8_t function_number = 1; // fn_Pointer_t call_function = functions[function_number]; // // Check und Call func_to_call_2() // if (call_function != 0) { call_function(); } // // ////////////////////////////////////////////////////////////////////////// // // ////////////////////////////////////////////////////////////////////////// // // Variablen/Zahlen konvertieren und ausgeben // // Integer nach ASCII wandeln // // char meinbuffer[xx]; // Beispiel Ausgabebuffer // itoa_init_ptr(meinbuffer); // Zeichen werden über die interne Funktion // // itoa_putch(char ch) nach "meinbuffer[]" geschrieben // itoa_i16d(-4711); // "-04711" nach meinbuffer[] // // char* stringende = itoa_init_ptr(0); // liefert Position für nächstes Zeichen // *stringende++ = '\n'; // Zeilenumbruch // *stringende = 0; // Stringendemarker // // // itoa_i16d = int16 -> Dezimalzahl 5-stellig -32768..+32767 // itoa_u16d = uint16 -> Dezimalzahl 5-stellig 0..65535 // itoa_i8d = int8 -> Dezimalzahl 4-stellig -128..+127 // itoa_u8d = uint8 -> Dezimalzahl 3-stellig 0..255 // itoa_99d = uint8 -> Dezimalzahl 2-stellig 0..99 o. "ON" // itoa_u16h = uint16 -> Hexadezimal 4-Stellig // itoa_u8h = uint8 -> Hexadezimal 2-Stellig // itoa_u8b = uint8 -> Binärzahl 8-Stellig // // -> val = der nach ASCII zu wandelnde Wert // // atoi_i16 = string -> Integer -32768..+32767 // ////////////////////////////////////////////////////////////////////////// // extern char itoa_buffer[10]; void itoa_i16d(char* str, int16_t val); void itoa_u16d(char* str,uint16_t val); void itoa_i8d(char* str, int8_t val); void itoa_u8d(char* str, uint8_t val); void itoa_99d(char* str, uint8_t val); void itoa_u16h(char* str,uint16_t val); void itoa_u8h(char* str, uint8_t val); void itoa_u8b(char* str, uint8_t val); int16_t atoi_i16(char* str); // ////////////////////////////////////////////////////////////////////////// // #ifdef __cplusplus } // extern "C" #endif #endif //_BTLIB__H_ // EOF
Compiler results:
Werbung
Online
Bogdancmd
bradlygoi441228704773
josch
paulinegonsalves19
sashaserrano161
taracfj57630663