Hallo liebe Microcontroller Community, ich sitze nun seit mehreren Tagen an einem Projekt für mein Studium (Elektro-& Informationstechnik) bei dem ich einfach nicht weiter komme. Mit der Suchfunktion habe ich leider nicht das passende gefunden, da es ein eher spezielles Problem ist, welches ich nun genauer erläutern werde. Als Entwicklungsumgebung dient ein modifiziertes Eclipse welches auf einer Virtuellen Maschine unter Linux läuft. Das Programm wurde in C programmiert. Verwendete Hardware: ATmega128, STK500, AVR Dragon In diesem Projekt geht es um die Verwendung des ParallelIO und des ADC. Ich werde nun den Kommentierten Quellcode posten und dann erläutern, an welchen Stellen es Probleme macht. Über Hilfe wäre ich sehr dankbar, da ich momentan nicht weiter weiß woran es liegt und es unter Eclipse mit dem Debuger nicht so einfach ersichtlich ist, wo die Probleme auftauchen. *fett*Quellcode: *fett*Funktionen: /* * adc.c * * Created on: 26.05.15 * Author: ---- * */ //enthält alle Definitionen für den eingestellten Prozessor #include <avr/io.h> #include "adc.h" #include <util/delay.h> //////////////////////////////////////////////////////////// //Implementierung der Funktionen /*Schaltet den ADC ein und konfiguriert ihn mit den folgenden Einstellungen: *fs = 19,12kHz *Uref = 5,00V *Wandler-Ergebnis rechtsbündig *Kanal ADC0, Single Ended * *Paramter: keine *Rückgabe: keine */ void init_ADC(){ ADMUX|=(1<<REFS0); //Das Bit 6 des ADMUX Registers auf 1 setzen (Interne Spannungsreferenz 5V) ADMUX&=~(1<<ADLAR)|(1<<MUX4)|(1<<MUX3)|(1<<MUX2)|(1<<MUX1)|(1<<MUX0); //Die Bit's 5 bis 0 des ADMUX Registers auf 0 setzen (ADC0=>Kanal0 und ADLAR Rechtsbündig) //Eigentlich überflüssig, da Default Wert schon auf 0 ADCSRA|=(1<<ADEN); //ADC Einschalten (Bit 7 des ADCSRA Registers auf 1 setzen) ADCSRA|=(1<<ADPS2); //Prescaler auf 16 setzen ADCSRA&=~(1<<ADPS1)|(1<<ADPS0); //Eigentlich überflüssig, da Default Wert schon auf 0 } /*Setzt den Running-Modus und startet die Wandlung(Konversion) * *Paramter: mode *Rückgabe: keine */ void start_ADC(eADCRUNMODE mode){ if(mode==FREERUN){ //Freerunning-Modus aktivieren und die Konvertion starten ADCSRA|=(1<<ADFR); ADCSRA|=(1<<ADSC); } else if(mode==SINGLESHOT){ //Freerunning-Modus deaktivieren und die Konvertion starten ADCSRA&=~(1<<ADFR); //Single Conversation ADCSRA|=(1<<ADSC); } else{ ADCSRA&=~(1<<ADFR); //Single Conversation ADCSRA|=(1<<ADSC); } } /*Stoppt die Wandlung, indem sie den ADC in den Running-Modus "single shot" schaltet, *ohne eine neue Messung zu starten * *Paramter: keine *Rückgabe: keine */ void stop_ADC(){ ADCSRA&=~(1<<ADFR); //Freerunning-Modus deaktivieren => ADC stoppen } /*Wartet auf das Ende einer Wandlung(Polling des ADIF-Bits) und setzt dann das ADIF-Bit auf 0 durch setzen einer 1 im ADIF-Bit * *Paramter: keine *Rückgabe: keine */ void wait_ADC(){ while((ADCSRA & (1<<ADIF))==0); //Warte solange bis das Ergebnis !=0 ist (Bis Wandlung abgeschlossen) ADCSRA|=(1<<ADIF); //Rücksetzen des ADIF-Bits durch setzen einer 1 } /*Liest den gewandeltetn 10-Bit-Digitalwert aus und liefert ihn in der gewählten Auflösung zurück. * *Paramter: res *Rückgabe: result */ unsigned short read_ADC(eADCRES res){ unsigned short result=0; unsigned short result_low=0; unsigned short result_high=0; if(res==BIT10){ result_low = ADCL; // High- und Low-Teil auslesen result_high = ADCH; // 2 höchstwertige Bits immer als letztes auslesen! result=(result_high<<8)|result_low; // Beides zu 10 Bit Wert zusammenfügen return result; } else if(res==BIT8){ // 8-Bit-Ergebnis (höchstwertige 8 Bit) result_low = ADCL; // High- und Low-Teil auslesen result_high = ADCH; // 2 höchstwertige Bits immer als letztes auslesen! result=(result_high<<8)|result_low; // Beides zu 10 Bit Wert zusammenfügen result=result>>2; // Die zwei niederwertigsten Bits "rausschieben" return result; } else{ return result; //Im falle einer Fehleingabe 0 zurückgeben } } /*Lifert die niederwertigste Ziffer eines Wertes vom Typ unsigned long (z) als ungepackte BCD-Zahl * sowie den durch 10 geteilten Rest des Wertes (r)(über den Zeiger-Parameter value) * *Paramter: unsigned long* value Zeiger auf den zu konvertierenden Wert *Rückgabe: z */ unsigned char ulong2bcd_unpk(unsigned long* value){ if(*value !=0){ //Wenn die Eingabe ungleich 0 ist unsigned char z = *value%10; //Niederwertigstens Teil der Zahl in z speichern unsigned long r = (*value-z)/10; //Höherwertigen Teil der Zahl in r speichern value = &r; //Höherwertigen Teil im Übergabeparameter speichern! return z; //Niederwertigen Teil in Rückgabeparameter z zurückgeben } else{ //Sonderfall, wenn value = 0 return 0; } } /*Wandelt einen zweistelligen Wert(<100) vom Typ unsigned long in eine gepackte BDC-Zahl um * *Paramter: value *Rückgabe: result */ unsigned char ulong2bcd_pk(unsigned long value){ unsigned char low_nibble=0,high_nibble=0,result=0; //Lokale Variablen deklarieren und initialisieren if(value < 100){ //Wert MUSS kleiner als 100 sein! low_nibble=ulong2bcd_unpk(&value); //Bestimmen des niederwertigen Teils der Zahl und speichern in low_nibble, sowie //bestimmen des höherwertigen Teils und speichern in value high_nibble=(value<<4); //Den höherwertigen Teil der Zahl um 4 Stellen nach links verschieben (Max 9 = 00001001 => 10010000) result=high_nibble|low_nibble; //Den höherwertigen Teil ODER-Verknüpfen mit dem niederwertigeren Teil und speichern in Result return result; } else{ return 0xff; //Falls unzulässige Eingabe 0xff zurückgeben } } /*Beispiel: Zahl 83 wird in value übergeben *->low_nibble=ulong2bcd_unpk(&temp); *low_nibble = 3 = 0b00000011 *high_nibble = 8 = 0b00001000 *->high_nibble=(temp<<4); *high_nibble um 4 Bit nach Links verschieben = 0b10000000 *->result=high_nibble|low_nibble; *low_nibble und high_nibble ODER-Verknüpfen = 0b10000011 (1000 0011 = 8 3) */ /*rechnet einen Messwert(digital) in einen Spannungswert in V um und liefert diesen zurück. * Hinweis: Die Umrechnung erfolgt unter Berücksichtigung der Spannungsreferenz uref und der Aufkösung res des übergebenen Messwertes * *Paramter: value - Messwert(digital *Paramter: res - Auflösung des Messwerts *Paramter: uref - Spannungsreferenzwert des ADC (entspricht Spannung bei maximalem Messwert => 5V) *Rückgabe: result */ float ushort2Volt(unsigned short value, eADCRES res, float uref){ float result=0.0; //deklarieren und initialisieren von lokalen Variablen if(res==BIT8){ //Wenn Auflösung = 8Bit result=(float)((value*uref)/255); //Berechnung return result; } else if(res==BIT10){ //Wenn Auflösung = 8Bit result=(float)((value*uref)/1023); //Berechnung return result; } else{ return result; //Sonst 0.0 zurückgeben } } /*Beispiel: Potentiometer wird voll Aufgedreht (100%); res=8Bit * value = 255 * result = (255*5)/255 (result = 5.0 V */ *fett*Hauptprogramm: void main_03(void){ //Programm, dass beim Druck auf beliebige Taste eine Einzelmessung startet //und das Messergebnis (10Bit) in Volt (je eine Stelle vor dem Komma und eine Stelle //nach dem Komma, z.B. 4,3V) auf den LED's anzeigt. eADCRUNMODE mode=FREERUN; eADCRES res=BIT10; float value=0.0; //deklarieren und initialisieren der lokalen Variablen float uref=5.0; init_ADC(); //initialisieren des ADC start_ADC(mode); //Starten des ADC mit eingestelltem mode (hier FREERUN) MIT_initPorts_Ain_Bout(); //Port A wird für die Eingabe und Port B für die Ausgabe initialisiert while(1){ MIT_wait4key_A(); //Wartet auf einen beliebigen Tastendruck wait_ADC(); //Auf Abschluss der Wandlung warten value=ushort2Volt(read_ADC(res),res,uref); //Wandlungsergebnis als Volt zurückgeben value=value*10; //Für die Weiterverarbeitung mit 10 multiplizieren MIT_putByteLED_B(ulong2bcd_pk((long)value)); //Wert als gepackte BCD-Zahl auf Port B ausgeben } } /*Beispiel: read_ADC(res) ergibt einen Wert von 1023 (Regler 100%) * ushort2Volt gibt einen Wert von 5.0 zurück * 5.0 * 10 = 50 * ulong2bcd_pk ruft ulong2bcd_unpk auf um Einer und Zehnerstelle zu ermitteln und liefert dann eine gepackte BCD zahl * von 0101 0000 * Ausgabe dieser Zahl auf Port B *fett*Problemstellung: Leider bekomme ich nicht die richtigen Werte angezeigt. Für das triviale Beispiel bei 5V müssten LED 4 und 6 leuchten. Leider leuchten stattdessen LED 4 und 1, also 1.2V was murks ist. Ich bin schon zu festgefahren in dieser Funktion, dass ich den Fehler nicht erkenne. Die ushort2Volt arbeitet richtig. Es muss war bei der gepackten BCD Zahl konvertierung falsch laufen. Um Hilfe wäre ich sehr dankbar! Mit freundlichen Grüßen Benny
Bekommst Du den Code auch etwas Forumskonformer dargestellt? Dann machen sich eventuell mehr Leute die Mühe sich das anzusehen! G Teo
Bzw... du hast doch nem Debugger...step doch einfach mal durch!?
1 | /*
|
2 | * adc.c
|
3 | |
4 | *
|
5 | * Created on: 26.05.15
|
6 | * Author: ----
|
7 | *
|
8 | */
|
9 | |
10 | //enthält alle Definitionen für den eingestellten Prozessor
|
11 | #include <avr/io.h> |
12 | #include "adc.h" |
13 | #include <util/delay.h> |
14 | |
15 | ////////////////////////////////////////////////////////////
|
16 | |
17 | |
18 | //Implementierung der Funktionen
|
19 | |
20 | /*Schaltet den ADC ein und konfiguriert ihn mit den folgenden
|
21 | Einstellungen:
|
22 | *fs = 19,12kHz
|
23 | *Uref = 5,00V
|
24 | *Wandler-Ergebnis rechtsbündig
|
25 | *Kanal ADC0, Single Ended
|
26 | *
|
27 | *Paramter: keine
|
28 | *Rückgabe: keine
|
29 | */
|
30 | void init_ADC(){ |
31 | ADMUX|=(1<<REFS0); //Das Bit 6 des ADMUX Registers auf 1 setzen |
32 | (Interne Spannungsreferenz 5V) |
33 | ADMUX&=~(1<<ADLAR)|(1<<MUX4)|(1<<MUX3)|(1<<MUX2)|(1<<MUX1)|(1<<MUX0); |
34 | //Die Bit's 5 bis 0 des ADMUX Registers auf 0 setzen (ADC0=>Kanal0 und
|
35 | ADLAR Rechtsbündig) |
36 | //Eigentlich überflüssig, da Default Wert schon auf 0
|
37 | ADCSRA|=(1<<ADEN); //ADC Einschalten (Bit 7 des ADCSRA |
38 | Registers auf 1 setzen) |
39 | ADCSRA|=(1<<ADPS2); //Prescaler auf 16 setzen |
40 | ADCSRA&=~(1<<ADPS1)|(1<<ADPS0); //Eigentlich überflüssig, da |
41 | Default Wert schon auf 0 |
42 | }
|
43 | |
44 | /*Setzt den Running-Modus und startet die Wandlung(Konversion)
|
45 | *
|
46 | *Paramter: mode
|
47 | *Rückgabe: keine
|
48 | */
|
49 | void start_ADC(eADCRUNMODE mode){ |
50 | if(mode==FREERUN){ //Freerunning-Modus aktivieren und die |
51 | Konvertion starten |
52 | ADCSRA|=(1<<ADFR); |
53 | ADCSRA|=(1<<ADSC); |
54 | }
|
55 | else if(mode==SINGLESHOT){ //Freerunning-Modus deaktivieren und die |
56 | Konvertion starten |
57 | ADCSRA&=~(1<<ADFR); //Single Conversation |
58 | ADCSRA|=(1<<ADSC); |
59 | }
|
60 | else{ |
61 | ADCSRA&=~(1<<ADFR); //Single Conversation |
62 | ADCSRA|=(1<<ADSC); |
63 | }
|
64 | }
|
65 | |
66 | /*Stoppt die Wandlung, indem sie den ADC in den Running-Modus "single
|
67 | shot" schaltet,
|
68 | *ohne eine neue Messung zu starten
|
69 | *
|
70 | *Paramter: keine
|
71 | *Rückgabe: keine
|
72 | */
|
73 | void stop_ADC(){ |
74 | ADCSRA&=~(1<<ADFR); //Freerunning-Modus deaktivieren => ADC |
75 | stoppen
|
76 | }
|
77 | |
78 | /*Wartet auf das Ende einer Wandlung(Polling des ADIF-Bits) und setzt
|
79 | dann das ADIF-Bit auf 0 durch setzen einer 1 im ADIF-Bit
|
80 | *
|
81 | *Paramter: keine
|
82 | *Rückgabe: keine
|
83 | */
|
84 | void wait_ADC(){ |
85 | while((ADCSRA & (1<<ADIF))==0); //Warte solange bis das Ergebnis !=0 |
86 | ist (Bis Wandlung abgeschlossen) |
87 | ADCSRA|=(1<<ADIF); //Rücksetzen des ADIF-Bits durch setzen |
88 | einer 1 |
89 | }
|
90 | |
91 | /*Liest den gewandeltetn 10-Bit-Digitalwert aus und liefert ihn in der
|
92 | gewählten Auflösung zurück.
|
93 | *
|
94 | *Paramter: res
|
95 | *Rückgabe: result
|
96 | */
|
97 | unsigned short read_ADC(eADCRES res){ |
98 | |
99 | unsigned short result=0; |
100 | unsigned short result_low=0; |
101 | unsigned short result_high=0; |
102 | |
103 | if(res==BIT10){ |
104 | result_low = ADCL; // High- und Low-Teil auslesen |
105 | result_high = ADCH; // 2 höchstwertige Bits immer als |
106 | letztes auslesen! |
107 | result=(result_high<<8)|result_low; // Beides zu 10 Bit Wert |
108 | zusammenfügen |
109 | return result; |
110 | }
|
111 | else if(res==BIT8){ |
112 | // 8-Bit-Ergebnis (höchstwertige 8 Bit)
|
113 | result_low = ADCL; // High- und Low-Teil auslesen |
114 | result_high = ADCH; // 2 höchstwertige Bits immer als |
115 | letztes auslesen! |
116 | result=(result_high<<8)|result_low; // Beides zu 10 Bit Wert |
117 | zusammenfügen |
118 | result=result>>2; // Die zwei niederwertigsten Bits |
119 | "rausschieben"
|
120 | return result; |
121 | }
|
122 | else{ |
123 | return result; //Im falle einer Fehleingabe 0 zurückgeben |
124 | }
|
125 | }
|
126 | |
127 | /*Lifert die niederwertigste Ziffer eines Wertes vom Typ unsigned long
|
128 | (z) als ungepackte BCD-Zahl
|
129 | * sowie den durch 10 geteilten Rest des Wertes (r)(über den
|
130 | Zeiger-Parameter value)
|
131 | *
|
132 | *Paramter: unsigned long* value Zeiger auf den zu konvertierenden Wert
|
133 | *Rückgabe: z
|
134 | */
|
135 | |
136 | |
137 | unsigned char ulong2bcd_unpk(unsigned long* value){ |
138 | |
139 | if(*value !=0){ //Wenn die Eingabe ungleich 0 ist |
140 | |
141 | unsigned char z = *value%10; //Niederwertigstens Teil der Zahl in z |
142 | speichern
|
143 | unsigned long r = (*value-z)/10; //Höherwertigen Teil der Zahl in r |
144 | speichern
|
145 | |
146 | value = &r; //Höherwertigen Teil im Übergabeparameter |
147 | speichern! |
148 | return z; //Niederwertigen Teil in Rückgabeparameter z |
149 | zurückgeben |
150 | }
|
151 | else{ //Sonderfall, wenn value = 0 |
152 | return 0; |
153 | }
|
154 | }
|
155 | |
156 | |
157 | /*Wandelt einen zweistelligen Wert(<100) vom Typ unsigned long in eine
|
158 | gepackte BDC-Zahl um
|
159 | *
|
160 | *Paramter: value
|
161 | *Rückgabe: result
|
162 | */
|
163 | |
164 | |
165 | unsigned char ulong2bcd_pk(unsigned long value){ |
166 | |
167 | unsigned char low_nibble=0,high_nibble=0,result=0; //Lokale Variablen |
168 | deklarieren und initialisieren |
169 | if(value < 100){ //Wert MUSS kleiner als 100 sein! |
170 | low_nibble=ulong2bcd_unpk(&value); //Bestimmen des |
171 | niederwertigen Teils der Zahl und speichern in low_nibble, sowie |
172 | //bestimmen des höherwertigen Teils und
|
173 | speichern in value |
174 | high_nibble=(value<<4); //Den höherwertigen Teil der |
175 | Zahl um 4 Stellen nach links verschieben (Max 9 = 00001001 => 10010000) |
176 | result=high_nibble|low_nibble; //Den höherwertigen Teil |
177 | ODER-Verknüpfen mit dem niederwertigeren Teil und speichern in Result |
178 | return result; |
179 | }
|
180 | else{ |
181 | return 0xff; //Falls unzulässige Eingabe 0xff |
182 | zurückgeben |
183 | }
|
184 | }
|
185 | /*Beispiel: Zahl 83 wird in value übergeben
|
186 | *->low_nibble=ulong2bcd_unpk(&temp);
|
187 | *low_nibble = 3 = 0b00000011
|
188 | *high_nibble = 8 = 0b00001000
|
189 | *->high_nibble=(temp<<4);
|
190 | *high_nibble um 4 Bit nach Links verschieben = 0b10000000
|
191 | *->result=high_nibble|low_nibble;
|
192 | *low_nibble und high_nibble ODER-Verknüpfen = 0b10000011 (1000 0011 = 8
|
193 | 3)
|
194 | */
|
195 | |
196 | |
197 | |
198 | /*rechnet einen Messwert(digital) in einen Spannungswert in V um und
|
199 | liefert diesen zurück.
|
200 | * Hinweis: Die Umrechnung erfolgt unter Berücksichtigung der
|
201 | Spannungsreferenz uref und der Aufkösung res des übergebenen Messwertes
|
202 | *
|
203 | *Paramter: value - Messwert(digital
|
204 | *Paramter: res - Auflösung des Messwerts
|
205 | *Paramter: uref - Spannungsreferenzwert des ADC (entspricht Spannung bei
|
206 | maximalem Messwert => 5V)
|
207 | *Rückgabe: result
|
208 | */
|
209 | float ushort2Volt(unsigned short value, eADCRES res, float uref){ |
210 | float result=0.0; //deklarieren und initialisieren von |
211 | lokalen Variablen |
212 | if(res==BIT8){ //Wenn Auflösung = 8Bit |
213 | result=(float)((value*uref)/255); //Berechnung |
214 | return result; |
215 | }
|
216 | else if(res==BIT10){ //Wenn Auflösung = 8Bit |
217 | result=(float)((value*uref)/1023); //Berechnung |
218 | return result; |
219 | }
|
220 | else{ |
221 | return result; //Sonst 0.0 zurückgeben |
222 | }
|
223 | |
224 | }
|
225 | /*Beispiel: Potentiometer wird voll Aufgedreht (100%); res=8Bit
|
226 | * value = 255
|
227 | * result = (255*5)/255 (result = 5.0 V
|
228 | */
|
229 | |
230 | |
231 | |
232 | *fett*Hauptprogramm: |
233 | |
234 | |
235 | |
236 | void main_03(void){ //Programm, dass beim Druck auf |
237 | beliebige Taste eine Einzelmessung startet |
238 | //und das Messergebnis (10Bit) in Volt (je eine Stelle
|
239 | vor dem Komma und eine Stelle |
240 | //nach dem Komma, z.B. 4,3V) auf den LED's anzeigt.
|
241 | |
242 | eADCRUNMODE mode=FREERUN; |
243 | eADCRES res=BIT10; |
244 | |
245 | float value=0.0; //deklarieren und initialisieren der |
246 | lokalen Variablen |
247 | float uref=5.0; |
248 | |
249 | init_ADC(); //initialisieren des ADC |
250 | start_ADC(mode); //Starten des ADC mit eingestelltem |
251 | mode (hier FREERUN) |
252 | MIT_initPorts_Ain_Bout(); //Port A wird für die Eingabe und |
253 | Port B für die Ausgabe initialisiert |
254 | while(1){ |
255 | MIT_wait4key_A(); //Wartet auf einen beliebigen |
256 | Tastendruck
|
257 | wait_ADC(); //Auf Abschluss der Wandlung warten |
258 | value=ushort2Volt(read_ADC(res),res,uref); //Wandlungsergebnis als |
259 | Volt zurückgeben |
260 | value=value*10; //Für die Weiterverarbeitung mit 10 |
261 | multiplizieren
|
262 | MIT_putByteLED_B(ulong2bcd_pk((long)value)); //Wert als gepackte |
263 | BCD-Zahl auf Port B ausgeben |
264 | }
|
265 | }
|
266 | /*Beispiel: read_ADC(res) ergibt einen Wert von 1023 (Regler 100%) |
267 | * ushort2Volt gibt einen Wert von 5.0 zurück |
268 | * 5.0 * 10 = 50 |
269 | * ulong2bcd_pk ruft ulong2bcd_unpk auf um Einer und Zehnerstelle |
270 | zu ermitteln und liefert dann eine gepackte BCD zahl |
271 | * von 0101 0000 |
272 | * Ausgabe dieser Zahl auf Port B |
Hallo Frank, wie beschrieben, ist das lieder nicht so leicht mit dem Debuger. Tastendrücke etc. kann ich nicht simulieren, bzw. der Simulator reagiert nicht darauf. Das ganze geht nur richtig im Labor mit der Hardware zu testen (kann ich erst am nächsten Dienstag wieder rein) ;-) Es geht eigentlich nur um die Funktion ganz unten in der Main. Die Funktionen am anfang sind nur Vorgeplänkel um die Fuktionsweise näher zu erläutern.
1 | value = &r; //Höherwertigen Teil im Übergabeparameter speichern! |
Das ist falsch, denn damit änderst Du den Zeiger, nicht den Wert dahinter. Richtig wäre:
1 | *value = r; |
Allgemein, warum überhaupt so umständlich mit zwei Funktionen, Zeigern etc.? Das kann man auch mit einem Einzeiler erledigen:
1 | unsigned char dec2bcd(unsigned char val) |
2 | {
|
3 | return ((val / 10) << 4) | (val % 10); |
4 | }
|
Hey Hans, 1000 Dank! Das ging schnell ;-) So viel kreativen Freiraum zum überlegen haben wir leider nicht. Die Prototypen, Parameter und Rückgabeparameter sind vorgegeben. Auch die Funktion zum berechnen. Eigentlich recht banal das ganze, wenn man nicht immer so leichtsinnige Fehler reinbasteln würde wie ich ;-) Nochmals vielen dank, du hast mir eine menge graue Haare erspart. Manchmal sieht man den Wald vor lauter Bümen nicht :-/
Benny schrieb: > ...Projekt für mein Studium... und Benny schrieb: > So viel kreativen Freiraum zum überlegen haben wir leider nicht. -> da läuft aber mächtig was schief wenn die Studenten bei der Lösung der Aufgaben schon nicht mehr frei denken dürfen.
Japp sehe ich genau so... Macht das ganze... 1. nicht einfacher, wenn so viel vorgegeben ist und man sich beim durchlesen der Aufgabe schon so einiges dabei überlegt hat und 2. ist das Ziel des Studiums so komplett verfehlt...
Naja allerdings sind wir auch nur "Hobby-Programmierer".. ach nichtmal das :D So alle 2 Wochen mal ein Labor zu dem Thema.. Da kommt halt auch nicht viel bei rum, wenn man sich nicht noch aus Freude am Thema daheim noch Stunden damit auseinandersetzt. Da gibt es weit aus schwierigere Fächer bei denen man noch genug "denken" darf ;-)
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.