Forum: Compiler & IDEs ADC, _delay_ms(), 16bit->8bit


von grsi (Gast)


Lesenswert?

Hallo,
Ich hab auf dieser Seite das AVR-GCC-Tutorial gelesen, wobei drei kleine 
Fragen aufgetaucht sind:

1. zu den ADC: Die Integrierten ADC messen ja Spannungen. Wenn ich nun 
den Widerstand eines Phototransistors messen will, wie stelle ich das am 
besten an?
Bei einer Serieschaltung von einem Widerstand und dem Phototransistor 
die Spannung über dem Widerstand messen? oder ist es geschickter die im 
Tutorial beschriebene Methode fürs messen ohne ADC zu verwenden?

Ist es Ratsam als externe Referenzspannung die AVCC zu benutzen?

2. zur Fkt _delay_ms();
Wenn ichs richtig verstanden hab, so macht der Microcontroller bei 
dieser Fkt einfach während einer gewissen Zeit nix. Man könnte damit 
bspweise eine Impulsfkt schreiben, die erst den Ausgangspin auf 1 setzt, 
einige Sekunden wartet, und ihn dann auf 0 setzt.
Oder man könnte sie nutzen um zB alle 100ms einen Messwert abzulesen. 
komm ich da mit dem Watchdog in Konflikt?

Ist dies eine gute Idee? oder gibts da bessere Methoden?


3. Kann ich in C wie bei C++ mit dem Shiftoperator ">>" bits 
'abschneiden'? und ist es möglich einem uint8_t ein uint16_t Wert 
zuzuweisen, wenn ja, welche bits werden dabei übernommen?
Konkret will ich ein 10bit Messwert in einen 7bit oder 6bit runden und 
dabei auch noch Speicher sparen.


Gruss Grsi

von Marco Beffa (Gast)


Lesenswert?

1. Also das kommt darauf an wie stark die Änderungen deines 
Fotowiderstandes sind. evt. könntest (must) du noch was verstärken 
z.b.mit nem OP... am besten rechnest du mal ein wenig und probierst 
dann...

Wenn AVCC bei dir sauber und stabil ist, kein Problem.

2. Der Watchdog resetet deine Controller einfach immer wenn er nicht 
rechtzeitig zurück gesetzt wird. Ich denke das reicht dir als Erklärung.

3. Ja das ist möglich. Meiner Meinung nach werden da einfach Nullen 
reingeschoben und auf der Anderen seite Bits rausgeschoben (die sind 
dann weg). Es werden die unteren 8 Bit des uint16 Types genommen.


von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

> Ist dies eine gute Idee?

Liest du dir denn auch die Doku durch?  Zweiter Absatz der Doku zu
<util/delay.h>:

``In general, for long delays, the use of hardware timers is much
preferrable, as they free the CPU, and allow for concurrent processing
of other events while the timer is running. However, in particular for
very short delays, the overhead of setting up a hardware timer is too
much compared to the overall delay time.''

Das sollte dir alles sagen.

Übrigens gibt's für die Bitschieberei (ein halbes Mal darfst du raten,
aus welcher Sprache C++ den >>-Operator geerbt hat :) beim ADC noch
einen netten Trick: wenn du das 10-Bit-Ergebnis auf ein 8-Bit-Ergebnis
runden willst, kannst du bei allen neueren AVRs das Bit ADLAR (ADC
left-adjust result) setzen.  Dann wird das Ergebnis linksbündig ins
ADC-Doppelregister eingetragen, d. h. das Register ADCH enthält die 8
most significant bits.  Die Schieberei wird also hier gleich von der
Hardware erledigt, und in der Software liest du einfach nur ADCH statt
ADCW aus.

von Wolfram (Gast)


Lesenswert?

>Ich hab auf dieser Seite das AVR-GCC-Tutorial gelesen, wobei drei kleine
>Fragen aufgetaucht sind:
Das sind keine "kleinen" Fragen, die du stellst, sondern es zeigt große 
Wissenlücken auf. Tu Dir selbst einen Gefallen und lies ein Buch zu 
Grundlagen der Elektrotechnik/Elektronik und zu C.
Alles andere wird dich in eine Sackgasse führen.

von johnny.m (Gast)


Lesenswert?

> Ist es Ratsam als externe Referenzspannung die AVCC zu benutzen?
Bei allen aktuellen AVRs ist AVCC als Referenzspannung intern 
auswählbar. Schließe nicht AVCC an AREF an, das kann zu Problemen führen 
und macht auch keinen Sinn. Einzige Ausnahme: Wenn Du noch mit den alten 
AT90Sxxxx-Controllern arbeitest. Die brauchen noch generell eine externe 
Referenz an AREF.

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.