PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Fehler suche



amal
15.07.2011, 09:34
#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;
}

ich bekomme diese Fehlern,
../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

markusj
15.07.2011, 09:56
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

Hubert.G
15.07.2011, 10:53
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

PicNick
15.07.2011, 11:31
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"

Hubert.G
15.07.2011, 12:19
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)"

amal
15.07.2011, 12:36
stimmt, in INT0 fehlt ein Klammer,
danke

amal
15.07.2011, 12:39
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
das war einen schreibfehler, eigentlich nur 0b11111111.
danke

021aet04
16.07.2011, 11:13
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

0b11111111
0b 1111 1111
ergibt
8+4+2+1 8+4+2+1
15 15
0x f f
Ergebnis 0xff

Du kannst aber auch so schreiben. So kannst du leichter einzelne Pins zuweisen ohne herumrechnen.

DDRB |= (1<<PB0) | (1<<PB1)....(1<<PB7);

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.

MfG Hannes

radbruch
16.07.2011, 11:28
Hallo

Gelegentlich ist die binäre Schreibweise vorteilhafter. Um trotzdem den Überblick zu behalten verwende ich eine zusätzliche Kommentarzeile:

// 76543210
DDRB=0b11111111;


Gruß

mic