Also ich habe einen wert von 1-1024 und ich will ihn im code zum testen X mal blinken lassen void blink(void) { // PORTD ^= (1<<PD6); // toggle LED1 PORTD ^= (1<<PD6); // toggle LED1 _delay_ms(150); // PORTD ^= (1<<PD6); // toggle LED1 PORTD ^= (1<<PD6); // toggle LED1 _delay_ms(150); } nun errechne ich wert=adcval/10 //adcval ist ein wert zwischen 1-1024 Wird, wenn ich in der Blink Routine einen abziehe mit wert-- das hinterm Komma ignoriert? Oder wie bringe ich das besser unter. Das ist für mich eine ungefaire anzeige was ankommt.
kabu schrieb: > Also ich habe einen wert von 1-1024 > und ich will ihn im code > zum testen X mal blinken lassen > void blink(void) { > // PORTD ^= (1<<PD6); // toggle LED1 > PORTD ^= (1<<PD6); // toggle LED1 > _delay_ms(150); > // PORTD ^= (1<<PD6); // toggle LED1 > PORTD ^= (1<<PD6); // toggle LED1 > _delay_ms(150); > } > > nun errechne ich > wert=adcval/10 //adcval ist ein wert zwischen 1-1024 > > Wird, wenn ich in der Blink Routine einen abziehe mit > wert-- > das hinterm Komma ignoriert? welchen Datentyp hat denn adcvak bzw. wert? Bitte merk dir: Bei C sind immer auch die Datentypen wichtig! Sowohl für dich als auch für uns, wenn wir dir eine Frage beantworten sollen.
Achso ich will spannung am ADC0 messen. Ref ist 5V Und der blinker sollte wenn ich richtig gerechnert habe bei 575=9V bzw 2.8V am ADC0 anfangen zu blinken. Das aber erst wenns fertig ist. Die schaltung muß ich noch zuerst zuende aufbauen. Jetzt mom ist die Grundschaltung fertig. Und ich muß nur noch den Spannungsteiler mit 22K und 10K an ADC0 anlegen. Software ist auch soweit IO. Aber ich wollte diesen blinker zur kontrolle haben. So das ich mit 14Volt anfangen kann, und langsam mich auf 9Volt runtertasten kan und,zusehen kann wie der wert am ADC0 abnimmt. Also habe ich mir gedacht das der Mc den Wert vom ADC einfach durch 100 teilen kann und mir xmal die LED leuchten läst.
kabu schrieb: > Achso ich will spannung am ADC0 messen. Das hab ich mir schon gedacht. > teilen kann und mir xmal die LED leuchten läst. Um deine Frage zu beantworten, muss man trotzdem die Datentypen der beteiligten Variablen kennen, das ist doch nicht so schwer zu verstehen. Sind das int, oder unsigned char? Sind das float oder long? Was denn nun?
Äh posten wollte ich den Code eigentlich noch nicht. Aber... Sag du mir das. Ich habe sowas nie gelernt. Alles was ich mit Elektonik,MC und GCC weiß habe ich aus dem Inet. Ich wollte das geblinke austauschen mit eben diese oben beschiebenden.
1 | #include <avr/io.h> |
2 | #define F_CPU 8000000UL /* 8 Mhz-Takt; */ |
3 | #include <util/delay.h> |
4 | |
5 | /* ADC initialisieren */
|
6 | void ADC_Init(void) { |
7 | |
8 | uint16_t result; |
9 | |
10 | ADMUX = (1<<REFS0) | (1<<REFS0); // interne Referenzspannung nutzen |
11 | ADCSRA = (1<<ADPS1) | (1<<ADPS0); // Frequenzvorteiler |
12 | ADCSRA |= (1<<ADEN); // ADC aktivieren |
13 | |
14 | /* nach Aktivieren des ADC wird ein "Dummy-Readout" empfohlen, man liest
|
15 | also einen Wert und verwirft diesen, um den ADC "warmlaufen zu lassen" */
|
16 | |
17 | ADCSRA |= (1<<ADSC); // eine ADC-Wandlung |
18 | while (ADCSRA & (1<<ADSC) ); // auf Abschluss der Konvertierung warten |
19 | /* ADCW muss einmal gelesen werden, sonst wird Ergebnis der nächsten
|
20 | Wandlung nicht übernommen. */
|
21 | result = ADCW; |
22 | }
|
23 | |
24 | /* ADC Einzelmessung */
|
25 | uint16_t ADC_Read( uint8_t channel ) |
26 | {
|
27 | // Kanal waehlen, ohne andere Bits zu beeinflußen
|
28 | ADMUX = (ADMUX & ~(0x1F)) | (channel & 0x1F); |
29 | ADCSRA |= (1<<ADSC); // eine Wandlung "single conversion" |
30 | while (ADCSRA & (1<<ADSC) ) // auf Abschluss der Konvertierung warten |
31 | ;
|
32 | return ADCW; // ADC auslesen und zurückgeben |
33 | }
|
34 | |
35 | //blinken
|
36 | void blink(void) { |
37 | // PORTD ^= (1<<PD6); // toggle LED1
|
38 | PORTD ^= (1<<PD6); // toggle LED1 |
39 | _delay_ms(150); |
40 | // PORTD ^= (1<<PD6); // toggle LED1
|
41 | PORTD ^= (1<<PD6); // toggle LED1 |
42 | _delay_ms(150); |
43 | }
|
44 | /* Beispielaufrufe: */
|
45 | |
46 | int main(void) { |
47 | |
48 | DDRD = (1<<PD6) | (1<<PD5);//leds als ausgenag |
49 | PORTD ^= (1<<PD5); // toggle LED1 |
50 | while (1) // loop (endless) |
51 | {
|
52 | uint16_t adcval; |
53 | ADC_Init(); |
54 | |
55 | adcval = ADC_Read(0); // Kanal 0 |
56 | if (adcval==0) blink(); |
57 | _delay_ms(1000); |
58 | if (adcval>500) blink();blink(); |
59 | _delay_ms(1000); |
60 | if (adcval<1024) blink();blink();blink(); |
61 | _delay_ms(1000); |
62 | if (adcval>1024) blink();blink();blink();blink(); |
63 | _delay_ms(1000); |
64 | }
|
65 | }
|
kabu schrieb: > Äh posten wollte ich den Code eigentlich noch nicht. Ich hab ja auch nicht den Code angefordert, sondern die Datentypen der Variablen. Was ist so schwer daran zu schreiben: adcval ist ein uint16_t und wert ebenfalls. Bumm bin ich zufrieden und geb dir den Tip ein C-Buch zu kaufen und zu lesen. Denn dann wüsstest du, dass in adcval/10 schon gar keine Nachkommastellen enstehen, weil nur integer Datentypen an der Division beteiligt sind und daher auch eine Integer Division gemacht wird. http://www.mikrocontroller.net/articles/FAQ#Datentypen_in_Operationen Damit stellt sich aber deine Frage > nun errechne ich > wert=adcval/10 //adcval ist ein wert zwischen 1-1024 > > Wird, wenn ich in der Blink Routine einen abziehe mit > wert-- > das hinterm Komma ignoriert? überhaupt nicht. Denn zu keinem einzigen Zeitpunkt gibt es hier irgendwelche Kommastellen. PS: Den Tip, ein C-Buch zu besorgen und zumindest das erste Drittel durchzuarbeiten halte ich nach wie vor aufrecht. 80% aller C-Fragen hier im Forum würden sich in Luft auflösen, wenn die Leute nur vorher ein C-Buch zumindest im ersten Drittel durchgearbeitet hätten.
Danke das wollte ich wissen. THX. Welches C buch ist denn zu empfehlen was auch ein Laier versteht? Natürlich schwerpunkt AVM MC's Proggen kann ich eigentlich garnicht. Ich kann ur mit Linux skripten. Das hilft nur bedingt.Aber ich weiß wenigstens was if while und for bedeutet.
>Laier
ist gut. Frag mal die Suche nach C-Buch oder K&R. Amazon und Co. dürften
auch einige Bücher und Rezensionen dazu haben...
kabu schrieb: > Danke das wollte ich wissen. Und wenn du gleich im ersten Codeschnipsel vermerkt hättest, dass alles Integer ist, dann hättest du deine Antwort schon heute morgen vorgefunden :-)
Hallo kabu, genau genommen macht das kein unterschied ob das jetzt ein c-buch für den pc oder für einen µC ist. Die Grundlagen sind die gleichen (datentypen etc...) Ich fand dieses Buch für AVRs sehr gut: http://www.amazon.de/Mikrocomputertechnik-mit-Controllern-Atmel-AVR-RISC-Familie/dp/3486577174 LG
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.