Forum: Mikrocontroller und Digitale Elektronik Fehler beim builden eines Projekts


von unix1970 (Gast)


Lesenswert?

Liebes Forum,

wir haben in der Schule zurzeit ein Schulprojekt und dazu muss ein 
Microcontroller programmiert werden, der eine Steuerung für ein Auto mit 
Brennstoffzelle übernimmt. Dafür haben wir uns für dieses Projekt 
entschieden. Hierzu wird ein ATTiny2313 verwendet. Als ich nun den Code 
in AVR-Studio eingegeben habe kam dies hier raus:

Build started 17.5.2011 at 13:13:02
avr-gcc  -mmcu=attiny2313 -Wall -gdwarf-2 -Os -std=gnu99 -funsigned-char 
-funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT uart.o -MF 
dep/uart.o.d  -c  ../../Downloads/Wrtilty/Wrtilty/AVR/uart.c
../../Downloads/Wrtilty/Wrtilty/AVR/uart.c: In function 'UART_Init':
../../Downloads/Wrtilty/Wrtilty/AVR/uart.c:6: error: 'UBRRL' undeclared 
(first use in this function)
../../Downloads/Wrtilty/Wrtilty/AVR/uart.c:6: error: (Each undeclared 
identifier is reported only once
../../Downloads/Wrtilty/Wrtilty/AVR/uart.c:6: error: for each function 
it appears in.)
../../Downloads/Wrtilty/Wrtilty/AVR/uart.c:15: error: 'UCSRB' undeclared 
(first use in this function)
../../Downloads/Wrtilty/Wrtilty/AVR/uart.c:15: error: 'RXEN' undeclared 
(first use in this function)
../../Downloads/Wrtilty/Wrtilty/AVR/uart.c:15: error: 'TXEN' undeclared 
(first use in this function)
../../Downloads/Wrtilty/Wrtilty/AVR/uart.c:17: error: 'UCSRC' undeclared 
(first use in this function)
../../Downloads/Wrtilty/Wrtilty/AVR/uart.c:17: error: 'UCSZ1' undeclared 
(first use in this function)
../../Downloads/Wrtilty/Wrtilty/AVR/uart.c:17: error: 'UCSZ0' undeclared 
(first use in this function)
../../Downloads/Wrtilty/Wrtilty/AVR/uart.c: In function 'UART_InChar':
../../Downloads/Wrtilty/Wrtilty/AVR/uart.c:22: error: 'UCSRA' undeclared 
(first use in this function)
../../Downloads/Wrtilty/Wrtilty/AVR/uart.c:22: error: 'RXC' undeclared 
(first use in this function)
../../Downloads/Wrtilty/Wrtilty/AVR/uart.c:24: error: 'UDR' undeclared 
(first use in this function)
../../Downloads/Wrtilty/Wrtilty/AVR/uart.c: In function 'UART_OutChar':
../../Downloads/Wrtilty/Wrtilty/AVR/uart.c:29: error: 'UCSRA' undeclared 
(first use in this function)
../../Downloads/Wrtilty/Wrtilty/AVR/uart.c:29: error: 'UDRE' undeclared 
(first use in this function)
../../Downloads/Wrtilty/Wrtilty/AVR/uart.c:31: error: 'UDR' undeclared 
(first use in this function)
make: *** [uart.o] Fehler 1
Build failed with 15 errors and 0 warnings...

Der Code ist jeweils: Uart.c
1
/* Initialize UART */       
2
void UART_Init (unsigned long baudrate) { 
3
  /* Set the baud rate */   
4
  //Assumes 8Mhz clock in single speed (U2X=0) mode
5
  switch(baudrate){
6
  case 9600:   UBRRL = 51; break; //.2% error
7
  case 19200:  UBRRL = 25; break; //.2% error
8
  case 38400:  UBRRL = 12; break; //.2% error
9
  case 57600:  UBRRL = 8; break;  //-3.5% error
10
  case 115200: UBRRL = 1; break;  //8.5% error
11
  default: UBRRL=12;
12
  }
13
14
  /* Enable UART receiver and transmitter */   
15
  UCSRB = (1 << RXEN) | (1 << TXEN);   
16
  /* set to 8 data bits, 1 stop bit */   
17
  UCSRC = (1<<UCSZ1) | (1<<UCSZ0); } 
18
19
/* Read and write functions */ 
20
unsigned char UART_InChar (void) {   
21
  /* Wait for incomming data */   
22
  while (!(UCSRA & (1 << RXC)));   
23
  /* Return the data */   
24
  return UDR; 
25
} 
26
27
void UART_OutChar (unsigned char data) {   
28
  /* Wait for empty transmit buffer */   
29
  while (!(UCSRA & (1 << UDRE)));   
30
  /* Start transmittion */   
31
  UDR = data; 
32
}
und Wrtilty.c
1
/* wrtilty.c
2
 *
3
 * Code to control a motor and a servo using an ATTiny2313. The ATTiny receives
4
 * commands through the UART and sets its PWM or servo pulse accordingly.
5
 *
6
 * John Boiles
7
 * 31 October 2008 
8
 */
9
10
#include <inttypes.h>
11
#include <avr/io.h>
12
#include <avr/interrupt.h>
13
#include <avr/sleep.h>
14
#include "uart.c"
15
16
#define OC0 PB2
17
#define OCR OCR0A
18
#define DDROC DDRB
19
#define TIMER0_TOP 255  /* 8-bit PWM */
20
//Set COM0A1:0 = 2 for non-inverted pwm and 3 for inverted pwm
21
//Use the following line for FastPWM
22
//#  define TIMER0_PWM_INIT _BV(WGM00) | _BV(WGM01) | _BV(COM0A1)
23
//Use the following line for PhaseCorrectPWM
24
#define TIMER0_PWM_INIT _BV(WGM00) | _BV(COM0A1)
25
//The clocksource determines the timer's frequency
26
//CS = 1 ClkIO = Clk
27
//CS = 2 ClkIO = Clk / 8
28
//CS = 3 ClkIO = Clk / 64
29
//CS = 4 ClkIO = Clk / 256
30
//CS = 5 ClkIO = Clk / 1024//CS = 6,7 External Clock
31
#define TIMER0_CLOCKSOURCE _BV(CS02) //| _BV(CS00)
32
33
//For the servo
34
#define TIMER1_CLOCKSOURCE _BV(CS11) //Clock / 8
35
36
//This should work if it's not volatile, but it didn't
37
volatile unsigned short ServoPulse;
38
//Create a 20ms period for servo control
39
ISR (TIMER1_COMPA_vect)
40
{
41
  //PORTB |= 0x08;
42
  PORTB &= ~0x08;
43
  OCR1A = TCNT1 + 20000;   //20000 * 1MHz = 20ms
44
  OCR1B = TCNT1 + ServoPulse;
45
  //Enable OC
46
  //TIMSK |= _BV(OCIE1B);
47
}
48
49
//Turn off servo control pulse
50
ISR (TIMER1_COMPB_vect)
51
{
52
  //PORTB &= ~0x08;       //PB3 is servo control
53
  PORTB |= 0x08;
54
55
  //Disable OC
56
  //TIMSK &= ~(1<<OCIE1B);
57
}
58
59
void SetServo(unsigned char input){
60
  unsigned short calc;
61
  calc = 988 + 4*input;
62
  ServoPulse = calc;
63
}
64
65
void
66
ioinit (void)                   /* Note [6] */
67
{
68
  /* Timer 0 is 8-bit PWM . */
69
  TCCR0A = TIMER0_PWM_INIT;
70
  TCCR1A = 0;
71
  /*
72
   * Start timer 0.
73
   *
74
   * NB: TCCR0A and TCCR0B could actually be the same register, so
75
   * take care to not clobber it.
76
   */
77
  TCCR0B |= TIMER0_CLOCKSOURCE;
78
  TCCR1B |= TIMER1_CLOCKSOURCE;
79
  
80
  /* Set PWM value to 0. */
81
  OCR = 0;
82
  
83
  DDRB |= 0x0F;
84
  //Set Direction:
85
  PORTB |= 0x01;
86
  PORTB &= ~0x02;
87
88
  //For inverted servo
89
  PORTB |= 0x08;
90
91
  /* Enable OC1 as output. */
92
  DDROC |= _BV (OC0);
93
  
94
  
95
  /* Enable timer 1 OC interrupt. */
96
  TIMSK |= _BV(OCIE1A) | _BV(OCIE1B);
97
  ServoPulse = 1500;
98
  sei ();
99
}
100
101
102
103
int
104
main (void)
105
{
106
107
  unsigned char in;
108
  UART_Init(38400); 
109
  ioinit ();
110
111
  /* loop forever, the interrupts are doing the rest */
112
  
113
  while (1){                    
114
    //sleep_mode();
115
    in = UART_InChar();
116
    switch(in){
117
    case ('a'):
118
      OCR = UART_InChar();
119
      PORTB |= 0x01;
120
      PORTB &= ~0x02;
121
      break;
122
    case ('A'):
123
      in = UART_InChar();
124
      OCR = in;
125
      PORTB &= ~0x01;
126
      PORTB |= 0x02;
127
      break;
128
    case ('s'):
129
      SetServo(UART_InChar());
130
      break;
131
    }
132
  }
133
  return (0);
134
}

Was soll ich jetzt tun?
Das Projekt von dem wir ausgehen ist auf johnboiles.com zu sehen.

Ich hoffe ihr könnt mir helfen
unix1970

: Gesperrt durch Moderator
von Klaus W. (mfgkw)


Lesenswert?

Du wirst die Headerdateien (#include...) auch in die uart.c einfügen
müssen.

Ein C-Compiler sieht immer nur die eine *.c, die er gerade kompiliert,
und wenn er also uart.c kompiliert weiß er nichts von wrtility.c und
den #include darin.

von Stefan E. (sternst)


Lesenswert?

uart.c separat zu compilieren und zusätzlich auch noch in Wrtilty.c zu 
inkludieren, ist auch nicht förderlich (letzteres weglassen).

von Klaus W. (mfgkw)


Lesenswert?

stimmt natürlich, das #include "uart.c" hatte ich gar nicht gesehen.
Das gehört natürlich weg.

von unix1970 (Gast)


Lesenswert?

Das habe ich nun getan. Aber neue Fehler tauchen auf. Könnte jemand das 
vielleicht builden und dann hier posten? Wir wären euch zutiefst 
dankbar.

von Karl H. (kbuchegg)


Lesenswert?

Ungern.
Es ist EUER Projekt und IHR werdet dafür benotet.
Schon schlimm genug, dass ihr geklauten Code verwendet.

von unix1970 (Gast)


Lesenswert?

Als Schüler eines neusprachlichen Gymnasiums war uns stets der Zugang zu 
einem richtigen Informatikunterricht verwehrt. Auch Lehrkräfte die uns 
unterstützen können fehlen. Unser Lehrer der das Projekt betreut weis 
davon Bescheid, dass wir hier im Internet fragen und hat auch nichts 
dagegen. Es ist gehöhrt zum P-Seminar, einem neuen Fach im G8 in Bayern, 
sowohl mit Lehrer als Team zu agieren, und zu erkennen, wenn man selbst 
nicht mehr weiter weiß und dann sich an Profis wendet. Deshalb fände ich 
es gut wenn ihr uns helfen würdet.
unix1970

von A.N. (Gast)


Lesenswert?

Frage dich doch einfach mal, WARUM die Fehler auftreten.

Soviel Zeit MUSST du dir nehmen, und soviel Zeit muss man dir auch
zugestehen.

Der Fehler ist einfach, die "neuen Fehler" hast du ja nicht gepostet,
und ich persönlich werde nicht die Zeit aufbringen, Avr Studio zu 
starten,
den Code per Copy/Paste reinzuhängen und auf Compile zu klicken.

Gerne helfe ich, wenn du eine konkrete Frage hast, aber das, was da
oben so steht, das zeigt, das blindes Kopieren ohne Verstehen angewendet
wird.

Sagt, was passiert eigentlich mit dem Auto und der Brennstoffzelle,
wenn der Code nen Fehler hat ? Ist dann der Schuld, der die obigen 
Zeilen
kompiliert und hier gepostet hat?

von Karl H. (kbuchegg)


Lesenswert?

Was du da fragst, sind relativ simple Grundlagen, wie man in C ein 
Projekt auf mehrere Dateien aufteilt, so dass alles Compilierbar ist.


Grunprinzip ist:

* jedes C-File wird unabhängig von allen anderen compiliert

* Der Compiler fängt oben mit dem Lesen des Quelltextes an und arbeitet
  sich in einem Lauf nach unten durch

* Wenn der Compiler beginnt, dann kennt er erst mal nur die
  Grundelemente von C. Alles andere muss ihm erst mal beigebracht
  werden. Dabei gilt:
  Man kann nur Dinge benutzen, die man vorher auch zumindest deklariert
  hat.

  Eine Variable kann man zb nur dann verenden, wenn man vorher eine
  Deklaration gesetzt hat. Oder anders ausgedrückt:
  So rum ist es falsch
1
  void foo()
2
  {
3
    i = 5;
4
    int i;
5
  }
  Ehe man i in einer Zuweisung verwenden kann, muss man es vorher
  deklarieren (in diesem Fall sogar definieren)
1
  void foo()
2
  {
3
    int i;
4
    i = 5;
5
  }

  Dasselbe gilt auch für Funktionen: Damit man eine Funktion aufrufen
  kann, muss man den Compiler erst mal mit der Funktion bekannt machen.
  Das kann auf mehrere Arten geschehen. Entweder man definiert die
  Funktion vor der ersten Verwendung
1
  void foo( void )
2
  {
3
    ...
4
  }
5
6
  int main()
7
  {
8
    foo();
9
  }
  oder man präsentiert dem Compiler eine Deklaration in Form eines
  Protoypen. (Man sagt dem Compiler, dass es die Funktion tatsächlich
  gibt und welche Argumentliste sie hat)
1
  void foo( void );   // Prototyp
2
3
  int main()
4
  {
5
    foo();   // da der Compiler durch den Protoypen schon weiß
6
             // das es die Funktion gibt und dass "foo" hier nicht
7
             // einfach nur ein Tippfehler ist, geht das auch.
8
             // Selbst wenn die eigentliche Funktion hier noch gar
9
             // nicht bekannt ist
10
  }
11
12
  void foo( void )
13
  {
14
     // und hier ist sie nun:
15
     // die eigentliche Funktion
16
  }
  Dabei muss die eigentliche Funktion noch nicht mal im selben C-File
  sein. Um den Funktionsaufruf zu compilieren, benötigt der Compiler
  nur den Prototypen. Die Implementierung der Funktion kann in einer
  ganz anderen Datei sein


Nach diesem Vorgeplänkel, wäre dieser Thread als vertiefende Lektüre, 
warum man da jetzt mit Header Files an die Sache rangeht, zu empfehlen

Beitrag "Den Befehl extern"
aber auch
http://www.mikrocontroller.net/articles/FAQ#Globale_Variablen_.C3.BCber_mehrere_Dateien
schlägt in etwa in diese Kerbe.

So wie auch jedes, aber auch wirklich jedes C-Buch, das da draussen 
kreucht und fleucht.

von ..... (Gast)


Lesenswert?

ihr lernt bei dem Projekt 0, wenn ihr es SO durchführt. Copy, Paste und 
Guttenberg, so wird das nix!

von A.N. (Gast)


Lesenswert?

Ach mist, nu hab ichs doch getan..

#include "uart.c" durch #include "uart.h" ersetzt, die uart.h noch
schnell zusammengeschrieben, 3 Zeilen .. und natürlich noch nen #include 
<avr/io.h> in die uart.c gepackt..


Und nun ?

von A.N. (Gast)


Lesenswert?

Pardon, vergessen:


AVR Memory Usage
----------------
Device: attiny2313

Program:     452 bytes (22.1% Full)
(.text + .data + .bootloader)

Data:          2 bytes (1.6% Full)
(.data + .bss + .noinit)


Build succeeded with 0 Warnings...

von Maximilian A. (unix1970)


Lesenswert?

1
rm -rf wrtilty.o  Wasserstoffauto_Steuerung.elf dep/* Wasserstoffauto_Steuerung.hex Wasserstoffauto_Steuerung.eep Wasserstoffauto_Steuerung.lss Wasserstoffauto_Steuerung.map
2
Build succeeded with 0 Warnings...
3
avr-gcc  -mmcu=attiny2313 -Wall -gdwarf-2 -Os -std=gnu99 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT wrtilty.o -MF dep/wrtilty.o.d  -c  ../../Downloads/Wrtilty/Wrtilty/AVR/wrtilty.c
4
../../Downloads/Wrtilty/Wrtilty/AVR/wrtilty.c: In function 'main':
5
../../Downloads/Wrtilty/Wrtilty/AVR/wrtilty.c:108: warning: implicit declaration of function 'UART_Init'
6
../../Downloads/Wrtilty/Wrtilty/AVR/wrtilty.c:115: warning: implicit declaration of function 'UART_InChar'
7
../../Downloads/Wrtilty/Wrtilty/AVR/wrtilty.c: At top level:
8
../../Downloads/Wrtilty/Wrtilty/AVR/wrtilty.c:135: warning: conflicting types for 'UART_Init'
9
../../Downloads/Wrtilty/Wrtilty/AVR/wrtilty.c:108: note: previous implicit declaration of 'UART_Init' was here
10
../../Downloads/Wrtilty/Wrtilty/AVR/wrtilty.c:153: error: conflicting types for 'UART_InChar'
11
../../Downloads/Wrtilty/Wrtilty/AVR/wrtilty.c:115: note: previous implicit declaration of 'UART_InChar' was here
12
make: *** [wrtilty.o] Fehler 1
13
Build failed with 1 errors and 3 warnings...
Das ist der neue Fehlercode. Das Problem ist, dass Ich nicht sehr viel 
Erfahrung mit der Programmierung von Microcontrollern habe. Das ganze 
Projekt ist sehr wichtig, da die Note die aus dem Seminar hervorgeht 
direkt ins Abitur einbezogen werden muss im G8. Auch aus diesem Grund 
hoffe ich ihr könnt mir helfen. Was auch gut möglich ist, ist dass ich 
mich einfach viel zu dumm anstelle beim Arbeiten mit AVR-Studio.
Sehe ich das richtig, dass die Variable UART_InChar zweimal deklariert 
wird und hier der Fehler liegt? Das heißt im Code ist jetzt ein Fehler
unix1970

von Maximilian A. (unix1970)


Lesenswert?

Oops ich war zu langsam mit meinem Post

von Karl H. (kbuchegg)


Lesenswert?

Maximilian A. schrieb:

> ../../Downloads/Wrtilty/Wrtilty/AVR/wrtilty.c: In function 'main':
> ../../Downloads/Wrtilty/Wrtilty/AVR/wrtilty.c:108: warning: implicit
> declaration of function 'UART_Init'

Na da haben wir es doch schon.
Der COmpiler geht von oben nach unten durch wrtilty.c durch (und nur 
durch wrtilty.c! die Datei uart.c interessiert ihn nicht)

Dabei stösst er auf einen Aufruf einer Funktion UART_Init.
Nur: Von dieser Funktion hat er noch nie gehört!
Daher die Warnung: Es treten Standardannahmen in Kraft.

> ../../Downloads/Wrtilty/Wrtilty/AVR/wrtilty.c:115: warning: implicit
> declaration of function 'UART_InChar'
> ../../Downloads/Wrtilty/Wrtilty/AVR/wrtilty.c: At top level:
> ../../Downloads/Wrtilty/Wrtilty/AVR/wrtilty.c:135: warning: conflicting
> types for 'UART_Init'

Tja. Und da steht jetzt im Klartext, dass die Standardannahmen Scheisse 
waren und offenbar nicht stimmen können.

> Das ist der neue Fehlercode. Das Problem ist, dass Ich nicht sehr viel
> Erfahrung mit der Programmierung von Microcontrollern habe.

Warum machst du dann so ein Projekt.
Und PS: Das ganze hat nichts mit Mikrocontrollern zu tun, sondern damit 
ob man eine bestimmte Programmiersprache, nämlich C so leidlich kann.

> Das ganze
> Projekt ist sehr wichtig, da die Note die aus dem Seminar hervorgeht
> direkt ins Abitur einbezogen werden muss im G8.

Abitur?
Dann bin ich raus.

> Auch aus diesem Grund
> hoffe ich ihr könnt mir helfen. Was auch gut möglich ist, ist dass ich
> mich einfach viel zu dumm anstelle beim Arbeiten mit AVR-Studio.

Das ganze hat weder etwas mit AVR-Studio, noch mit µC oder sonstwas zu 
tun, sondern ausschliesslich damit, dass du die Programmiersprache C 
nicht gut genug kennst.

Was das Problem ist, hab ich weiter oben schon ausführlich erklärt. Wenn 
es dazu noch Fragen gibt: OK, her damit. Aber die Lösung auf einem 
Silbertablett, das spielts nicht. Zumal die Lösung sehr einfach ist.

von Maximilian A. (unix1970)


Lesenswert?

Das Problem ist ich hatte nicht die große Wahl mit meinem P-Seminar. Da 
dieses Fach verpflichtend ist hatte ich nur die Wahl zwischen einem 
künstlerischen P-Seminar("Menschen im Isartal") und einem 
Naturwissenschaftlichen ("Energie aus Wasser"). Da ich vollkommen 
untalentiert im malen bin Wählte ich das P-Seminar "Energie aus Wasser". 
Unser Lehrer legte dann den genaueren Kurs für das Seminar fest.

Zum Code:
Da Funktion die main Funktion im Wrtilty.c und nicht im UART.c und UART 
in Wrtilty.c integriert wird, wird der Code aus UART.c nicht ausgelesen. 
Deshalb sollte nun UART.c in main integriert werden. Dort kam nun der 2. 
Fehler.
Liege ich jetzt richtig, dass A.N. beide Dateien in UART.h integrieren 
möchte, welche vor der Main funktion ausgelesen wird.
1
#include <stdio.h>
2
#include "UART.c"
3
#include "Wrtilty.c"
Wäre das So richtig für die Header-Datei?

von A.N. (Gast)


Lesenswert?

Na mal ganz ehrlich ...

.. die Note ist bislang wohl eindeutig Mangelhaft, egal wie gut die
Hardware ist.

Nun ists Zeit, C zu lernen, wenn es denn die Programmiersprache der
Wahl ist, um die Note von mangelhaft auf besseres niveau zu heben.

zumindest soweit zu lernen, das man versteht, warum der hier 
beschriebene
Fehler auftritt.. dabei ists noch nichtmal ein Programmierfehler im 
Sinne
von falscher Logik hinter dem Code...

von Karl H. (kbuchegg)


Lesenswert?

Das hier wäre auch noch ein Wiki-Artikel dazu

http://www.mikrocontroller.net/articles/Funktionen_auslagern_%28C%29

(ist allerdings nicht besonders gut aufbereitet)

von Maximilian A. (unix1970)


Lesenswert?

Glücklicher Weise ist ja zum glück nicht die Platine die Steuerung nicht 
das Hauptding, sondern das organisieren von Sponsorengeldern, die Wahl 
der richtige Brenstoffzelle, organisierung von hochreinen Wasserstoff, 
abstimmen des Chassis (selbstentwurf) auf die Gegebenheiten (wenig 
leistung von der Brennstoffzelle, trotz hohen Preises, nutzung der 
Motoren). Die Steuerung wäre nun das Tüpfelchen auf dem i. Kann mir 
jemand sagen ob es mit der vorgeschlagen Headerdatein funktionieren 
würde?

von Karl H. (kbuchegg)


Lesenswert?

Maximilian A. schrieb:

>
1
#include <stdio.h>
2
> #include "UART.c"
3
> #include "Wrtilty.c"
> Wäre das So richtig für die Header-Datei?


Möp.

*.C Files werden nicht includiert.
Gewöhn dir das gar nicht erst an.

von Karl H. (kbuchegg)


Lesenswert?


von A.N. (Gast)


Lesenswert?

Oh gott.. es wird immer schlimmer.

Hast du die beiden Postings von KHB überhaupt gelesen ??

Meine UART.H enthält nur die drei Zeilen mit den Funktionsdefinitionen
der uart.c - hey, so hab ich das glaub ich mal hier im C-Tutorial 
gelesen.

von Klaus W. (mfgkw)


Lesenswert?

Maximilian A. schrieb:
> Glücklicher Weise ist ja zum glück nicht die Platine die Steuerung nicht
> das Hauptding, sondern das organisieren von Sponsorengeldern, die Wahl
> der richtige Brenstoffzelle, organisierung von hochreinen Wasserstoff,
> abstimmen des Chassis (selbstentwurf) auf die Gegebenheiten (wenig
> leistung von der Brennstoffzelle, trotz hohen Preises, nutzung der
> Motoren)

... und das Schnorren der Programmierung.

von Maximilian A. (unix1970)


Lesenswert?

Dann muss ich also in der Header Datei die beiden problematischen 
Funktionen deklarieren. Und das war's? Wenn ich den Artikel richtig 
gelesen habe müsste es so dann stimmen, oder?

von Karl H. (kbuchegg)


Lesenswert?

Probiers aus.

Lies die Fehlermeldung, überlege was sie bedeutet und mach deine 
Änderungen danach. Das nötige Rüstzeug hast du ja jetzt.

Mehr als das du andere Fehlermeldungen bekommst, kann dir nicht 
passieren.
Aber: So lernt man!

von Maximilian A. (unix1970)


Lesenswert?

Ich habe das ganze jetzt in eine Datei gepackt. Fehler spuckt der 
Compiler keine mehr aus aber ich würde von euch gerne wissen ob durch 
die Änderung immer noch die Funktionalität der Datei gegeben ist.
1
/* wrtilty.c
2
 *
3
 * Code to control a motor and a servo using an ATTiny2313. The ATTiny receives
4
 * commands through the UART and sets its PWM or servo pulse accordingly.
5
 *
6
 * John Boiles
7
 * 31 October 2008 
8
 */
9
10
#include <inttypes.h>
11
#include <avr/io.h>
12
#include <avr/interrupt.h>
13
#include <avr/sleep.h>
14
//#include "uart.c"
15
16
#define OC0 PB2
17
#define OCR OCR0A
18
#define DDROC DDRB
19
#define TIMER0_TOP 255  /* 8-bit PWM */
20
//Set COM0A1:0 = 2 for non-inverted pwm and 3 for inverted pwm
21
//Use the following line for FastPWM
22
//#  define TIMER0_PWM_INIT _BV(WGM00) | _BV(WGM01) | _BV(COM0A1)
23
//Use the following line for PhaseCorrectPWM
24
#define TIMER0_PWM_INIT _BV(WGM00) | _BV(COM0A1)
25
//The clocksource determines the timer's frequency
26
//CS = 1 ClkIO = Clk
27
//CS = 2 ClkIO = Clk / 8
28
//CS = 3 ClkIO = Clk / 64
29
//CS = 4 ClkIO = Clk / 256
30
//CS = 5 ClkIO = Clk / 1024//CS = 6,7 External Clock
31
#define TIMER0_CLOCKSOURCE _BV(CS02) //| _BV(CS00)
32
33
//For the servo
34
#define TIMER1_CLOCKSOURCE _BV(CS11) //Clock / 8
35
36
//This should work if it's not volatile, but it didn't
37
volatile unsigned short ServoPulse;
38
//Create a 20ms period for servo control
39
ISR (TIMER1_COMPA_vect)
40
{
41
  //PORTB |= 0x08;
42
  PORTB &= ~0x08;
43
  OCR1A = TCNT1 + 20000;   //20000 * 1MHz = 20ms
44
  OCR1B = TCNT1 + ServoPulse;
45
  //Enable OC
46
  //TIMSK |= _BV(OCIE1B);
47
}
48
49
//Turn off servo control pulse
50
ISR (TIMER1_COMPB_vect)
51
{
52
  //PORTB &= ~0x08;       //PB3 is servo control
53
  PORTB |= 0x08;
54
55
  //Disable OC
56
  //TIMSK &= ~(1<<OCIE1B);
57
}
58
59
void SetServo(unsigned char input){
60
  unsigned short calc;
61
  calc = 988 + 4*input;
62
  ServoPulse = calc;
63
}
64
65
void
66
ioinit (void)                   /* Note [6] */
67
{
68
  /* Timer 0 is 8-bit PWM . */
69
  TCCR0A = TIMER0_PWM_INIT;
70
  TCCR1A = 0;
71
  /*
72
   * Start timer 0.
73
   *
74
   * NB: TCCR0A and TCCR0B could actually be the same register, so
75
   * take care to not clobber it.
76
   */
77
  TCCR0B |= TIMER0_CLOCKSOURCE;
78
  TCCR1B |= TIMER1_CLOCKSOURCE;
79
  
80
  /* Set PWM value to 0. */
81
  OCR = 0;
82
  
83
  DDRB |= 0x0F;
84
  //Set Direction:
85
  PORTB |= 0x01;
86
  PORTB &= ~0x02;
87
88
  //For inverted servo
89
  PORTB |= 0x08;
90
91
  /* Enable OC1 as output. */
92
  DDROC |= _BV (OC0);
93
  
94
  
95
  /* Enable timer 1 OC interrupt. */
96
  TIMSK |= _BV(OCIE1A) | _BV(OCIE1B);
97
  ServoPulse = 1500;
98
  sei ();
99
}
100
101
/* Initialize UART */       
102
void UART_Init (unsigned long baudrate) { 
103
  /* Set the baud rate */   
104
  //Assumes 8Mhz clock in single speed (U2X=0) mode
105
  switch(baudrate){
106
  case 9600:   UBRRL = 51; break; //.2% error
107
  case 19200:  UBRRL = 25; break; //.2% error
108
  case 38400:  UBRRL = 12; break; //.2% error
109
  case 57600:  UBRRL = 8; break;  //-3.5% error
110
  case 115200: UBRRL = 1; break;  //8.5% error
111
  default: UBRRL=12;
112
  }
113
114
  /* Enable UART receiver and transmitter */   
115
  UCSRB = (1 << RXEN) | (1 << TXEN);   
116
  /* set to 8 data bits, 1 stop bit */   
117
  UCSRC = (1<<UCSZ1) | (1<<UCSZ0); } 
118
119
/* Read and write functions */ 
120
unsigned char UART_InChar (void) {   
121
  /* Wait for incomming data */   
122
  while (!(UCSRA & (1 << RXC)));   
123
  /* Return the data */   
124
  return UDR; 
125
} 
126
127
void UART_OutChar (unsigned char data) {   
128
  /* Wait for empty transmit buffer */   
129
  while (!(UCSRA & (1 << UDRE)));   
130
  /* Start transmittion */   
131
  UDR = data; 
132
}
133
134
135
int
136
main (void)
137
{
138
139
  unsigned char in;
140
  UART_Init(38400); 
141
  ioinit ();
142
143
  /* loop forever, the interrupts are doing the rest */
144
  
145
  while (1){                    
146
    //sleep_mode();
147
    in = UART_InChar();
148
    switch(in){
149
    case ('a'):
150
      OCR = UART_InChar();
151
      PORTB |= 0x01;
152
      PORTB &= ~0x02;
153
      break;
154
    case ('A'):
155
      in = UART_InChar();
156
      OCR = in;
157
      PORTB &= ~0x01;
158
      PORTB |= 0x02;
159
      break;
160
    case ('s'):
161
      SetServo(UART_InChar());
162
      break;
163
    }
164
  }
165
  return (0);
166
}
Passt das noch so?
unix1970

von holger (Gast)


Lesenswert?

>Passt das noch so?

Zu faul zum selber ausprobieren?

von Maximilian A. (unix1970)


Lesenswert?

Könnte denn keiner was dazu sagen, da ich so viele Fehlerquellen wie 
möglich ausschließen möchte?

von holger (Gast)


Lesenswert?

>Könnte denn keiner was dazu sagen, da ich so viele Fehlerquellen wie
>möglich ausschließen möchte?

Das möchte ich auch, aber es ist jetzt an *dir*+ es selber
auszuprobieren. Oder wischt dir Mamma noch.....

von Knut (Gast)


Lesenswert?

Also mal im Ernst, du wirst später jeden Tag Probleme lösen müssen. Wenn 
du nicht langsam anfängst, dir eine Problemlösungsstrategie zu überlgen 
wirst du nicht weiter kommen. Sachen wie "ich hatte keine Wahl" zählen 
dann nicht mehr.

Außerdem willst du Abi machen, später ne Führungsposition besetzen und 
gutes Geld verdiehnen, also tu verdammt nochmal was dafür. Is schon fast 
dreist.

Knut

von Knut (Gast)


Lesenswert?

Fragen ist ja nicht verkehrt, jeder hat mal klein angefangen, aber "ich 
hab da was kopiert, bringt es einer für mich zum Laufen?" is nich...

von Maximilian A. (unix1970)


Lesenswert?

So den letzten Code habe ich auf AVR Studio 5 gebuilded: keine Fehler; 
dann noch einmal auf AVR Studio 4 gebuilded und 14 Fehler. Jetzt 
verstehe ich die Welt nicht mehr.

von holger (Gast)


Lesenswert?

>So den letzten Code habe ich auf AVR Studio 5 gebuilded: keine Fehler;
>dann noch einmal auf AVR Studio 4 gebuilded und 14 Fehler.

Welche Fehler?

von Maximilian A. (unix1970)


Lesenswert?

Mit fast allen variablen gibst probleme

von Karl H. (kbuchegg)


Lesenswert?

Ist ein gutes Zeichen.
Meistens ist es dann irgendeine Kleinigkeit, die man vergessen hat und 
die weite Kreise zieht. Behebe die Kleinigkeit und alle 14 Fehler 
verschwinden mit einem einzigen mal.

Aber ohne Fehlermeldung und das worauf sie sich bezieht, kann man halt 
so gar nichts konkretes sagen.

von Maximilian A. (unix1970)


Lesenswert?

ACE Studio neugestartet und alles passt jetzt. Keine Fehler mehr. Gibt 
es gut Handbücher für avr Studio?

von Maximilian A. (unix1970)


Lesenswert?

Ob das ganze funktioniert wird sich erst in ein paar Tagen 
herrausstellen wenn alle Komponenten da sind aber bis hierher vielen 
Dank für die Tipps!
Unix1970

von Michael K. (Gast)


Lesenswert?

Maximilian A. schrieb:

> Unser Lehrer legte dann den genaueren Kurs für das Seminar fest.

Ich frage mich, wie etwas geprüft werden und ausschlaggebend für eine 
Note sein kann, dessen Rahmenbedingungen sich in verwehrtem Unterricht 
und fehlenden Lehrkräften manifestieren.

Also entweder verarschst Du uns oder das deutsche Schulsystem ist doch 
schlechter als ich dachte.

Außerdem, wie will der Lehrer denn entscheiden, welche Note für das 
Ergebnis eines Projektes gerechtfertigt ist, dessen Grundlagen nie 
gelehrt wurden und von dem er selber keine Ahnung hat?

Und wenn er Ahnung hat, wieso erklärt er vorher nicht die Grundlagen? 
Dazu gibt es den Unterricht doch eigentlich.

42m

von Maximilian A. (unix1970)


Lesenswert?

Es geht in dem Seminar gemeinsam mit aussenstehenden Partnern ein 
Projekt auf die Beine zu stellen, Teamfähigkeit zu erlernen, 
Organisationstalent zu beweisen, etc. Kultusministerium Bayern: 
http://www.gymnasium.bayern.de/gymnasialnetz/oberstufe/seminare/p-seminar/
und natürlich http://isb.bayern.de/
Dort findet man alles, was dieses Thema betrifft
unix1970

von Klaus W. (mfgkw)


Lesenswert?

unix1970 schrieb:
> Aber neue Fehler tauchen auf. Könnte jemand das
> vielleicht builden und dann hier posten?

holger schrieb:
>>Passt das noch so?
>
> Zu faul zum selber ausprobieren?

Maximilian A. schrieb:
> Könnte denn keiner was dazu sagen, da ich so viele Fehlerquellen wie
> möglich ausschließen möchte?

holger schrieb:
>>So den letzten Code habe ich auf AVR Studio 5 gebuilded: keine Fehler;
>>dann noch einmal auf AVR Studio 4 gebuilded und 14 Fehler.
>
> Welche Fehler?

Maximilian A. schrieb:
> Mit fast allen variablen gibst probleme

vs.:

Maximilian A. schrieb:
> Teamfähigkeit zu erlernen,

dann mal los!

von Michael K. (Gast)


Lesenswert?

Maximilian A. schrieb:
> Es geht in dem Seminar gemeinsam mit aussenstehenden Partnern ein
> Projekt auf die Beine zu stellen, Teamfähigkeit zu erlernen,
> Organisationstalent zu beweisen, etc. Kultusministerium Bayern:

Also ist es vollkommen egal, ob die Steuerung funktioniert und was sie 
macht?
Dann lasst eine LED blinken und erklärt - am besten mit ner schönen 
Powerpoint-Präsentation - daß genau das blinken der Beweis ist, daß 
alles total toll funktioniert. Und wenn Ihr die LED nicht zum blinken 
bekommt, dann erklärt Ihr eben, warum das ein Zeichen für korrekte 
Funktion ist.

Wer will es denn überprüfen? Und vor allem, wen interessiert das 
Ergebnis, wenn der Weg das Ziel zu sein scheint?

> Dort findet man alles, was dieses Thema betrifft

Offensichtlich findet man dort nicht alles, ein gutes C-Tutorial scheint 
dort zumindest zu fehlen.

42m

von Karl H. (kbuchegg)


Lesenswert?

> Teamfähigkeit zu erlernen

Teamfähigkeit bedeutet auch zu wissen, wo seine Grenzen sind. Was man 
kann und was man nicht kann.

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

> gemeinsam mit aussenstehenden Partnern
> ein Projekt auf die Beine zu stellen

gegeben, alle betroffenen und Beteiligten vom MC-Board sind bereits 
eingespannt

> Organisationstalent zu beweisen

auch bereits erfolgt. Codeschnipsel wurden organisiert, und in einer 
Datei zusammen gefügt

> Teamfähigkeit zu erlernen,

passt auch. Er lernt ja grade noch.


> Also ist es vollkommen egal, ob die Steuerung funktioniert und was sie
macht?

Ja, siehe:

>> Autor: Maximilian A. (unix1970)
>> Datum: 17.05.2011 21:46
>> Glücklicher Weise ist ja zum glück nicht die Platine
>> die Steuerung nicht das Hauptding, sondern
>> ...
>> Die Steuerung wäre nun das Tüpfelchen auf dem i.


--> Maximilian ist mit seinem Projekt fast fertig.

von nicht gast (Gast)


Lesenswert?

> Fehler beim builden eines Projekts
Fehler beim Laden der deutschen Sprache

Da kriege ich Kotzkrämpfe wenn ich sowas sehe.

von Maximilian A. (unix1970)


Lesenswert?

Ich habe das ganze mal in WinAVR reingeschoben ohne Veränderung und auf 
einmal ging das ganze durch wie Butter. Kann mir jemand sagen warum es 
da funktioniert und bei AVR Studio nicht?

von Karl H. (kbuchegg)


Lesenswert?

Nein.

von Maximilian A. (unix1970)


Lesenswert?

Das Seminar heißt "Energie aus Wasser" und nicht "Wie bastle ich einen 
RC Ersatz mit einem Microcontroller". Da Microconroller nicht so ganz 
mein Gebiet sind, mein lieber Herr Lehrer jedoch das Ganze ganz schön 
fände, wende ich mich an euch in der Hoffnung auf Hilfe. Jedoch macht 
ihr euch fast alle nur über mich lustig, was definitiv nicht der Sinn 
eines Forums ist.

von Karl H. (kbuchegg)


Lesenswert?

Lies dir deine Fragestellung noch einmal durch.
Überlege welche Information du gegeben hast.

Dann frag dich selber: Aufgrund welcher INformation soll irgendwer in 
der Lage sein, deine Frage zu beantworten.

Tschüss (denn das war nicht das erste mal, dass man dir die Würmer aus 
der Nase ziehen muss. Und dazu haben die meisten hier einfach keine Lust 
mehr)

Beitrag #5943613 wurde von einem Moderator gelöscht.
Beitrag #5943614 wurde von einem Moderator gelöscht.
Beitrag #5943615 wurde von einem Moderator gelöscht.
Beitrag #5946988 wurde von einem Moderator gelöscht.
Beitrag #5946989 wurde von einem Moderator gelöscht.
Beitrag #5946991 wurde von einem Moderator gelöscht.
Dieser Beitrag ist gesperrt und kann nicht beantwortet werden.