Code:
/* Sicherung 15sep08 1120 ...C1..\m168D_10\m168D_com_10x80.c
===================================================================================
===================================================================================
Target MCU : M168
Target Hardware : div, z.B. flex168, m168D
Target cpu-frequ. : In der Quelle wählbar
===================================================================================
Enthaltene Routinen:
KEINE - nur Variablendefinitionen
===================================================================================
*** Versionsgeschichte:
====================
x82 29Jan09 Iz_diff0 wird im Test als Null angezeigt: unsigned-Problem?
ie_mot12 (-34?) wird als 63... angezeigt: unsigned-Problem?
....
x00 27jan08 00:ff Erster Aufbau von \2-drehz-mess\r2d_common_x00.h
Original: ...C1..\2_drehz-mess\ -
===================================================================================
*** Aufgabenstellung : Initialisierung und Abarbeitung von Interuptroutinen für
die Programmsammlung zum R2D2cd
================================================================================ */
/*==================================================================================
===================================================================================
================================================================================ */
/*##### Variablenliste, global #####*/
/*==================================================================================
===================================================================================
================================================================================ */
/*==================================================================================
Motordaten: Steuerung, Motortests
================================================================================ */
uint8_t imot = 1, kre = 1, kli = 1;
uint8_t min = 15, max = 122;
uint16_t mosore = 20, mosoli = 20; // Sollfahrt rechts und links
uint8_t moffre = 0, moffli = 0; // Geschwindigkeitsoffset Motor re/li
volatile uint8_t most12 = 0, most34 = 0; // Motoransteuerwert / Absolutwert
// vgl. zu most oben mosore/~li, moffre/~li etc.
volatile uint16_t stupsi12=0, stupsi34 = 0; // Sollwert Motoransteuerung
// = Führungsgröße w
volatile uint16_t tupsi12=0, tupsi34 = 0; // Istwert Motor
// = Regelgroesse x (= Iz_diff0)
// volatile float e_mot12, esum12, y12; // für Regelalgorithmus
volatile int16_t ie_mot12, iesum12, iy12; // für Regelalgorithmus
volatile int16_t idrz12, ndrz12; // Ist-/Solldrehzahl
volatile int16_t ie_mot34, iesum34, iy34; // für Regelalgorithmus
volatile int16_t idrz34, ndrz34; // Ist-/Solldrehzahl
uint16_t Iservo; // Counter für Regelfrequenz
/*==================================================================================
Encoderbedienung und Zeitdaten
================================================================================ */
/*Ab rev x42: Indizes f EXT-INT0 + EXT-INT1 angepasst: 0 und 1 statt 1 und 2 */
/* beachte: volatile! und Vorzeichenlos reicht für alle */
volatile uint16_t Iencdr0, Iencdr1; /* Counter für Encoder-ticks
Werden in der ISR hochgezählt und im main bei Gelegenheit
(welcher? - nach 5 sec?) - spätestens aber beim Fahrtrichtungswechsel
auf Null gesetzt. DAnn aber die Werte musv+musi entsprechend anpassen */
volatile uint16_t Ienc0alt, Ienc1alt; // Encoder-Altwerte
volatile uint16_t Iz_ysecv0, Iz_ysecv1; /* Zeitmarke "µsec"
des vorletzten Interrupts in der Einheit 100 Mikrosekunden. Ist der Wert des
hochlaufenden Timers zum Interruptzeitpunkt i-1 */
volatile uint16_t Iz_yseci0, Iz_yseci1; /* Zeitmarke "µsec"
des letzten Interrupts in der Einheit 100 Mikrosekunden. Ist der Wert des
hochlaufenden Timers zum Interruptzeitpunkt i (letzter Interrupt) */
//volatile uint16_t Iz_diff0, Iz_diff1;
volatile int16_t Iz_diff0, Iz_diff1;
/* Zeitdifferenz
Beim Abarbeiten des Interrupts wird yseci mit time1 belegt und diff aus der
Differenz yseci-ysecv errechnet. Danach wird yseci nach ysecv kopiert.
Im main bzw. regelung wird aus Iz_diffx die Drehzahl berechnet. */
volatile uint16_t Izeit_1; /* Timer läuft hoch
Die Interruptroutine läuft mit 20 kHz (Möglicherweise sind 100 kHz besser)
Beim Start des Timers läuft der Zähler time1 hoch und wird nach 3 sec -
also beim Wert 60 000 - wieder auf Null gesetzt. Dabei werden die Werte
ysecv und yseci angepasst */
volatile uint16_t Izthrznt; // Der zeitliche Horizont, z.B. 20000 für 2 sec
volatile uint16_t icntdwn; // Countdownzähler (max 43200 = 12 Std)
volatile uint16_t icdwvor; // x Sekunden Vorwarnung mit blLED
volatile uint16_t icdwmax; // x Sekunden aktueller Maximalwert für Countdown
volatile uint16_t Iztmp_0; /* Timer läuft hoch
Zeitdifferenz zwischen zwei extINT0 wenn die Differenz kleiner als 10 ist,
break - dann ist der Interrupt viel zu kurz um korrekt zu sein. */
volatile uint16_t Iztmp_1; /* Timer läuft hoch
Zeitdifferenz zwischen zwei extINT1 wenn die Differenz kleiner als 10 ist,
break - dann ist der Interrupt viel zu kurz um korrekt zu sein. */
volatile int16_t Ikre, Ikli, Iregel1, Iregel2; /* Zeitvorgaben und Regelwerte
Ikre und Ikli sind die Entsprechungen von kre und kli, sie werden
in der Regelungsroutine verarbeitet */
volatile uint8_t Idelta1=100, Idelta2=100; /* */
...............................
/*==================================================================================
===================================================================================
================================================================================ */
/*##### Modulliste #####*/
/*==================================================================================
===================================================================================
================================================================================ */
/*==================================================================================
Routinen in Datei m168D_dme_10x80.c Routinen: irDME-Routinen
================================================================================ */
void TC0IRP_CMA_init(void);
ISR(TIMER0_COMPA_vect);
void TC1PWM_init(void); //Init Timer/Counter 1, PWM-Signal
void setSRV1(uint16_t speed1); //Relative Pulslänge auf OC1A/PB1
/*==================================================================================
================================================================================ */
/*==================================================================================
Routinen in Datei m168D_inf_10x81.c Routinen: INFO´s
================================================================================ */
void init_USART0( unsigned int ubrr );
void sendchar(unsigned char c);
void sendUSART(char *s);
char getchar(void);
void getsUSART(char* Buffer, uint8_t MaxLen);
static inline void setportbon(const uint8_t n); // für Ports B, C und D
void info01(void); // Startinfo #####>>>>> steht IMMER im main
void info_Motst(void); // Ausgabe Daten zu ~tst~/void Motst_aufab(void)
void info_Motupm(void); // Ausgabe Upm zu ~tst~613~/void Motst_aufab(void)
void inf_irDME(uint8_t m1, uint8_t m2, uint8_t m3);
/*==================================================================================
================================================================================ */
....................
Aufpassen bei der Syntax für die Funktionsprototypen. Die werden so dargestellt wie oben geschrieben, praktisch wie die Funktion selbst, aber mit Semikolon danach ! ! !
Code:
/* Sicherung 28Jan09 1230 ...C1..\m168D_10\m168D_10x83.c
===================================================================================
Target MCU : ATmega168
Target Hardware : m168D für R2D03
Target cpu-frequ. : 20 MHz, externer Quarzoszillator
===================================================================================
Enthaltene Routinen :
#includes siehe unten
void info01(void) // Startinfo #####>>>>> steht IMMER im main-modul
int main(void)
===================================================================================
*** Versionsgeschichte:
====================
x83 28Jan09 1230 tupsitest Testweise Ausgabe stupsi, tupsi etc zur Kontrolle der
Fahrgeschwindigkeit: ==> Iz_diff0 wird falsch ausgegeben UND
ie_mot12/34 darf nicht usigned sein (kann ja negativ werden).
..............................
x00 17mai08 1556 Übernahme von *x342.c v. 26jun08 1336
===================================================================================
*** Aufgabenstellung : Software für R2_D03
in einer ersten Ausbaustufe angelehnt an: siehe Original
Original: ...C1..\m168D_10\m168D_10x342.c 26juni08 13ff
===================================================================================
Alle möglichen Portanschlüsse am ATMega168:
============== ===
PCINT14,/RESET,PC6 1 28 PC5,ADC5,SCL,PCINT13
PCINT16,RxD,PD0 2 27 PC4,ADC4,SDA,PCINT12
PCINT17,TxD,PD1 3 26 PC3,ADC3,PCINT11
PCINT18,INT0,PD2 4 25 PC2,ADC2,PCINT10
PCINT19,OC2B,INT1,PD3 5 24 PC1,ADC1,PCINT9
PCINT20,XCK,T0,PD4 6 23 PC0,ADC0,PCINT8
VCC 7 22 GND
GND 8 21 AREF
PCINT6,;XTAL1,TOSC1,PB6 9 20 VCC
PCINT7,XTAL2,TOSC2,PB7 10 19 PB5,SCK,PCINT5
PCINT21,OC0B,T1,PD5 11 18 PB4,MISO,PCINT4
PCINT22,OC0A,AIN0,PD6 12 17 PB3,MOSI,OC2,OC2A,PCINT3
PCINT23,AIN1,PD7 13 16 PB2,/SS,OC1B,PCINT2
PCINT0,CLKO,ICP1,PB0 14 15 PB1,OC1A,PCINT1
--------------------==========-----------------------
Vorgesehene/belegte Anschlüsse am (ATMega168)-R2D2cc:
================== (für ´168 d = Drive/Director)
/RESET 1 28 PC5,(SCL) aktuell LED
RxD,(PD0) 2 27 PC4,(SDA) aktuell LED
TxD,(PD1)___3 26___PC3, ADC0 / Sharp GP2D120
(SigMot1) ExtINT0,(PD2) 4 25 PC2, SFH 5110, IN irDME 4 } vorgesehen
(SigMot2) ExtINT1,(PD3) 5 24 PC1, SFH 5110, IN irDME 3 } evtl. auch in
(E7) _|-- 3,4 Guz, PD4___6 23___PC0, SFH 5110, IN irDME 1-2 } ´168 n
VCC 7 22 GND
GND 8 21 AREF
XTAL1 PB6___9 20___VCC
XTAL2 PB7 10 19 PB5, (Startblink/LED0, 3sec v Tmr0, Mehrzweck)
(E6) PWM 1,2 uz+Guz,PD5 11 18 PB4 _|-- 3,4 uz (E4) (hier oder PB3)
(E5) PWM 3,4 uz+Guz,PD6__12 17___PB3, Reserve 2
(E8) _|-- 1,2 uz,PD7 13 16 PB2, Servo
(E9) _|-- 1,2 Guz,PB0 14 15 PB1, OC1A = SFH 415, OUT (irDME) */
/* ============================================================================== */
#include <stdlib.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h> // Dies für die UART-Library "Fleury"
/* Beachte C:\Programme\WinAVR-20070525\avr\include\avr\iomx8.h */
#include "m168D_com_10x82signed.h" // commonvariable
#include "m168D_dme_10x80.c" // irDME Routinen
#include "m168D_inf_10x81.c" // Info-Ausgaben - - - Usart zuerst init.
//#include "m168D_kal_10x81.c" // Kalibrierungen, speziell irDME´s
//#include "m168D_kal_10x81x.c" // Kalibrierungen, speziell irDME´s
//#include "m168D_kal_10x81y.c" // Kalibrierungen, speziell irDME´s
#include "m168D_kal_10x81zz.c" // Kalibrierungen, speziell irDME´s
#include "m168D_mot_10x80.c" // Motorroutinen incl. PWM, Regelung Motor
#include "m168D_tmr_10x81.c" // Timer, PWM
#include "m168D_gpd_10x80.c" // ADC-Routinen für GP2D120 und Aufruf Regelung
//#include "m168D_tst_10x82x.c" // Testroutinen
//#include "m168D_tst_10x82y.c" // Testroutinen
#include "m168D_tst_10x83_tupsitest.c" // Testroutinen
#define MCU = AVR_ATmega168
#define F_CPU 20000000 // Quarz 20 Mhz-CPU
// #define BAUD 57600
#define UART_BAUD_RATE 57600 // Änderung am 19sep08 2220 für lib Fleury
#define MYUBRR ((unsigned int)((unsigned long) F_CPU/16/BAUD-1)) //vgl doc2545,S179
// und https://www.roboternetz.de/phpBB2/ze...=375337#375337
/* ============================================================================== */
/* Interrupt-Handler und -Adressen
Address Labels Code Comments
siehe C:\Programme\WinAVR-20070525\avr\include\avr\iomx8.h sowie
Interruptvektoren/-vektortabelle in *doc2545, S 63 von AVR */
/* ============================================================================== */
// ===== Subroutinen =============================================================
/* ============================================================================== */
.................................
/* ============================================================================== */
/* === HAUPTProgramm =========================================================== */
/* Initialisierungen, LED1 kurzblinken als Signal für Programmstart,
Ausgabe des Indentifizierungsstrings per USART */
int main(void)
{
uint8_t i;
//Pins/Ports als Ein- (0) oder Ausgänge (1) konfigurieren, Pull Ups (1) aktivieren
DDRB = 0b00110111; // siehe aktuell oben oder fortschritt/R2D2
PORTB = 0b11001000; // und Port/Pull Ups (1) aktivieren
DDRC = 0b01110000; // PC3 ist ADC3, PC0 .. 6 , kein PC7-Pin bei m168
PORTC = 0b00000111; // Änderung für ADC: PC3 ist Eingang ##>> OHNE Pullup !!
// Encoder_1 = ExtINT0 = PortD2, Encoder_2 = PortD3
DDRD = 0b11110000; // -> siehe unter DDRB, sowie PD2,3 extInt
PORTD = 0b00001111; // Pull Ups aktivieren
for(i=0; i<20; i++) // LED auf PC5 5 sek blinken lassen
// ###>>> bevor Interrupts erlaubt sind, um ungewollte
// Resets u.ä. besser erkennen zu können
{
setportcon(5); // Hellphase
waitms(3); // ... damit man kurze resets besser erkennt
setportcoff(5); // Dunkelphase
waitms(97);
}
TC0PWM_init(); //Init Timer/Counter0 für PWM/Motoren
TC0IRP_CMA_init(); //Init Tmr/Cnt0 CmprMtchA Interrupt enable - zu dme
TC1PWM_init(); //Init Timer/Counter1 36kHz/27,8µs am 19 Mai 2008, 2258Uhr
setSRV1(128); // und gleich irLED einschalten auf Maximalwert-
Isvs1 = 27; //Vorgabewert "Servoansteuerung" auf Mittelstellung
TC2TMR_init(); //Init Timer/Cntr2-Interrupt Zeitnahme 20 kHz/50 µsec
ADC3_10_init_irupt(); // Initialisiere ADC3, 10 Bit, MIT Interrupt
// init_USART0(MYUBRR); //USART0 initialisieren mit wählbarer Baudrate (s.o.)
uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) ); // Init "Fleury"
XTI_0_1_init(); //Initialisiere den externen Interrupt 0 und 1
sei(); //Globalen Interrupt freigeben
waitms(1000);
init_KO_lst(); //Initialisierung KOnstanten-Liste = Werte + div. Vorgaben
// Aufruf NACH sei(), weil irDME´s abgefragt werden.
waitms(1000);
info01(); //Startinfo über USART ausgeben
.................
}
// ===== Ende des Testabschnittes, er kann aus mehreren Abschnitten bestehen =====
// ================================================================================
/* Es folgt der aktuelle Übersetzungskommentar:
Build started 30.9.2008 at 18:13:37
avr-gcc.exe
-I"D:\pro-fils_D\compu+MC\C1 mC Projekte\m168D_10\alter_code\aug_08_allgem"
-I"D:\pro-fils_D\compu+MC\C1 mC Projekte\m168D_10\alter_code\jul_08_allgem"
-mmcu=atmega168 -Wall -gdwarf-2 -Os -std=gnu99 -funsigned-char
-funsigned-bitfields -fpack-
struct -fshort-enums -MD -MP -MT m168D_10.o -MF dep/m168D_10.o.d -c ../m168D_10.c
avr-gcc.exe -mmcu=atmega168 -Wl,-Map=m168D_10.map m168D_10.o -o m168D_10.elf
avr-objcopy -O ihex -R .eeprom m168D_10.elf m168D_10.hex
avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load"
--change-section-lma .eeprom=0 --no-change-warnings
-O ihex m168D_10.elf m168D_10.eep || exit 0
c:\Programme\WinAVR-20070525\bin\avr-objcopy.exe: there are no sections to be copied!
avr-objdump -h -S m168D_10.elf > m168D_10.lss
AVR Memory Usage
----------------
Device: atmega168
Program: 6772 bytes (41.3% Full)
(.text + .data + .bootloader)
Data: 494 bytes (48.2% Full)
(.data + .bss + .noinit)
Build succeeded with 0 Warnings...
============================================================ */
WENN nun die *.h im gleichen (Projekt-) Verzeichnis ist wie Deine haupt*.c mit dem "main"-Modul, dann reicht dieses #include xy.h . . . mehr musst Du nicht machen - den Compiler musst Du nicht mehr sagen - der sucht im aktuellen Verzeichnis ganz von selbst. Und dorthin gehört die *.h ja auch . . . .
Lesezeichen