www.mikrocontroller.net

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


Autor: kabu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: kabu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: kabu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
#include <avr/io.h>
#define F_CPU 8000000UL /* 8 Mhz-Takt; */
#include <util/delay.h>

/* ADC initialisieren */
void ADC_Init(void) {
 
  uint16_t result;
 
  ADMUX = (1<<REFS0) | (1<<REFS0);      // interne Referenzspannung nutzen
  ADCSRA = (1<<ADPS1) | (1<<ADPS0);     // Frequenzvorteiler
  ADCSRA |= (1<<ADEN);                  // ADC aktivieren
 
  /* nach Aktivieren des ADC wird ein "Dummy-Readout" empfohlen, man liest
     also einen Wert und verwirft diesen, um den ADC "warmlaufen zu lassen" */
 
  ADCSRA |= (1<<ADSC);                  // eine ADC-Wandlung 
  while (ADCSRA & (1<<ADSC) );          // auf Abschluss der Konvertierung warten
  /* ADCW muss einmal gelesen werden, sonst wird Ergebnis der nächsten
     Wandlung nicht übernommen. */
  result = ADCW;
}
 
/* ADC Einzelmessung */
uint16_t ADC_Read( uint8_t channel )
{
  // Kanal waehlen, ohne andere Bits zu beeinflußen
  ADMUX = (ADMUX & ~(0x1F)) | (channel & 0x1F);
  ADCSRA |= (1<<ADSC);            // eine Wandlung "single conversion"
  while (ADCSRA & (1<<ADSC) )     // auf Abschluss der Konvertierung warten
    ;
  return ADCW;                    // ADC auslesen und zurückgeben
}

//blinken
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);
}
/* Beispielaufrufe: */
 
int main(void) {

  DDRD = (1<<PD6) | (1<<PD5);//leds als ausgenag
   PORTD ^= (1<<PD5);  // toggle LED1
 while (1)                            // loop (endless)
  {
  uint16_t adcval;
  ADC_Init();
 
  adcval = ADC_Read(0);  // Kanal 0
  if (adcval==0) blink();
  _delay_ms(1000);
    if (adcval>500)   blink();blink();
  _delay_ms(1000);
    if (adcval<1024)   blink();blink();blink();
  _delay_ms(1000);
    if (adcval>1024)   blink();blink();blink();blink();
  _delay_ms(1000);
}
}

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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#Datent...

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.

Autor: kabu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: nerv (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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 :-)

Autor: B. G. (smarti)
Datum:

Bewertung
0 lesenswert
nicht 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-Cont...

LG

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.