Kann es sein, dass dir in INT0 eine schließende Klammer (die von der äußeren for-Schleife) abhanden gekommen ist? Bei sowas sind die nachfolgenden Fehlermeldungen oft nur bedingt Aussagekräftig
mfG
Markus
ich bekomme diese Fehlern,Code:#include <avr/io.h> #include <avr/interrupt.h> #include <stdint.h> #include <util/delay.h> #include <stdio.h> #include <stdlib.h> // PD0 = Taster für Richtung für alle Motoren // PD1 = Taster für Start // PD2 = Taster für Interrupt0 // PD3 = Taster für Interrupt1 // PD4 = Taster für Stop // PD5 = Taster für Reset // PB4 = Richtung für alle Motoren //****************************** // MOTOR 1 Richtung X //****************************** // PB0 = Enable M1 // PB1 = Clock M1 //****************************** // MOTOR 2 Richtung Y //****************************** // PB2 = Enable M2 // PB3 = Clock M2 // PC0 = Trigger // PD2 = Interrupt0 // PD3 = Interrupt1 volatile uint16_t zx,zy,D; void pause(D) { for(uint16_t i=0;i<D;i++) asm volatile ("nop"); } void STOP() { PORTB&=~(1<<PB0);//Mx En löschen PORTB&=~(1<<PB2);//My En löschen } ISR (INT0_vect) { PORTB|=(1<<PB0);//Mx En PORTB|=(1<<PB2);//My En PORTB|=(1<<PB4);// Richtung for(unsigned int i=0;i<10;i++) {zx=0; zy=0; for(unsigned int j=0;j<10;j++) { for(unsigned int k=0;k<10;k++) { PORTB|=(1<<PB1); // pause(1000); // Clk Mx PORTB&=~(1<<PB1); // zx++; } PORTC|=(1<<PC0); // pause(2000); // Triggern 5hz PORTC&=~(1<<PC0); // } for(unsigned int l=0;l<10;l++) { for(unsigned int m=0;m<10;m++) { PORTB|=(1<<PB3); // pause(1000); // Clk My PORTB&=~(1<<PB3); // zy++; } PORTC|=(1<<PC0); // pause(2000); // Triggern 5hz PORTC&=~(1<<PC0); // } PORTB&=~(1<<PB4);// Richtung ändern for(unsigned int n=0;n<10;n++) { for(unsigned int p=0;p<10;p++) { PORTB|=(1<<PB2); // pause(1000); // Clk Mx PORTB&=~(1<<PB2); // zx--; } PORTB|=(1<<PC0); pause(2000); //Triggern 5hz PORTB&=~(1<<PC0); } PORTB|=(1<<PB4);// Richtung for(unsigned int r=0;r<10;r++) { for(unsigned int s=0;s<10;s++) { PORTB|=(1<<PB3); // pause(1000); // Clk My PORTB&=~(1<<PB3); // zy++; } PORTC|=(1<<PC0); // pause(200); // Triggern 5hz PORTC&=~(1<<PC0); // } } ISR (INT1_vect) { void STOP(); pause(1000); PORTB|=(1<<PB0);//Mx En PORTB&=~(1<<PB4);// Richtung if(zy>0) { for(unsigned int q=0;q<zy;q++) { PORTB|=(1<<PB3); // pause(1000); // Clk My PORTB&=~(1<<PB3); // } } if(zx>0) { for(unsigned int q=0;q<zx;q++) { PORTB|=(1<<PB1); // pause(1000); // Clk Mx PORTB&=~(1<<PB1); // } } } //Hauptprogramm START---------- int main(void) { DDRD=0b11100000; // PIN 0-4 als Eingang definieren DDRB=0xb11111111; // PortB als Ausgang definieren DDRC|=(1<<PC0); // PC0 als Ausgang sei(); //Interrupts freigeben //Interrupt initialisieren EIMSK|=(1<<INT0)|(1<<INT1); EICRA|=(1<<ISC01)|(1<<ISC11); while(1) //Endlosschleife { } return 0; }
../M_XY_vers2.c:133: error: static declaration of '__vector_2' follows non-static declaration
../M_XY_vers2.c:133: error: previous declaration of '__vector_2' was here
weißt bitte jemand wo der Fehler ist?
danke
Kann es sein, dass dir in INT0 eine schließende Klammer (die von der äußeren for-Schleife) abhanden gekommen ist? Bei sowas sind die nachfolgenden Fehlermeldungen oft nur bedingt Aussagekräftig
mfG
Markus
Die Angabe welcher Kontroller und welcher Kompiler verwendet wird, erleichtert die Hilfestellung.
Diese Schreibweise im main führt möglicherweise auch zu einem Fehler: DDRB=0xb11111111; // PortB als Ausgang definieren
möglicherweise verwirrt ihn das:
volatile uint16_t zx,zy,D;
void pause(D)
{
das ist "D" statisch definiert, aber auch als argument f. "pause"
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Das "D" ist als globale Variable definiert, wird auch nicht verwendet und gehört entfernt.
Da im Programm ein Wert an die Funktion übergeben wird, muss diese Variable in Funktionsaufruf definiert sein.
Das " void pause(D) " ergibt ein Warning, es soll so aussehen "void pause(unsigned int D)"
stimmt, in INT0 fehlt ein Klammer,
danke
Statt 0b... kann man auch die Dezimalschreibweise oder Hexadezimalschreibweise nehmen.
Ich habe es am Anfang so gemacht, dass ich wenn ich einen ganzen Port o.Ä. setze zuerst die Binärschreibweise genommen habe (so wie du). Dann habe ich es in die Hex Schreibweise gewandelt und diese geschrieben. Die Umwandlung habe ich auf einem Zettel, den ich daneben gehabt habe gemacht.
Wenn du deine Binärschreibweise nimmst. Die einzelnen Schritte:
Ausgangskonfiguration hinschreiben (eventuell noch darüberschreiben, welcher Port gemeint ist (z.B. PB0-PB7)
Aufteilen in 2 Nibbles (4bit)
Zusammenrechnen
Als Hex Format hinschreiben
Du kannst aber auch so schreiben. So kannst du leichter einzelne Pins zuweisen ohne herumrechnen.Code:0b11111111 0b 1111 1111 ergibt 8+4+2+1 8+4+2+1 15 15 0x f f Ergebnis 0xff
Einen Tipp habe ich noch (man sollte aber das händisch umrechnen können). Der Rechner von Windows kann Standartmäßig Hex- (0-15), Binär- (0,1), Oktal- (0-7) Dezimalzahlen (0-9) umrechnen. Bei älteren Versionen (z.B. 2k, XP,..) muss man Wissenschaftlich wählen. Bei z.B. Win 7 muss man Programmierer wählen. Bei Vista bin ich mir nicht sicher wie es da ist, müsste nachschauen.Code:DDRB |= (1<<PB0) | (1<<PB1)....(1<<PB7);
MfG Hannes
Hallo
Gelegentlich ist die binäre Schreibweise vorteilhafter. Um trotzdem den Überblick zu behalten verwende ich eine zusätzliche Kommentarzeile:
GrußCode:// 76543210 DDRB=0b11111111;
mic
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
Lesezeichen