Forum: Compiler & IDEs z.B. 545/100=5,45 Also 5mal blinken lassen?


von kabu (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von kabu (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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?

von kabu (Gast)


Lesenswert?

Ä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
}

von Karl H. (kbuchegg)


Lesenswert?

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.

von kabu (Gast)


Lesenswert?

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.

von nerv (Gast)


Lesenswert?

>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...

von Karl H. (kbuchegg)


Lesenswert?

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 :-)

von B. G. (smarti)


Lesenswert?

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
Noch kein Account? Hier anmelden.