C Reed-Kontakt auswerten mit ATMega32

spider-man

Neues Mitglied
24. Feb. 2012
7
0
0
Sprachen
Hallo zusammen,

ich möchte mit meinem ATMega32 einen Reed-Kontakt auswerten. Leider funktioniert das nachfolgende Programm nicht. Der Reed-Kontakt hängt mit +5V am PB1 (T1). Kann mir vielleicht jemand weiterhelfen oder ein einfach ein Standard-Programm für die Auswertung des Reed-Kontaktes zukommen lassen, damit ich etwas rumprobieren kann.
Für Eure Bemühungen möchte ich mich einstweilen bedanken.

Gruß
Marco

// velocity measurement - target ATmega32

#define XTAL 8e6
#define F_CPU XTAL

#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdlib.h>
#include <util/delay.h>

#include "..\..\includes\BitUtilities.h"
#include "..\..\includes\LCD_display_on_Port_C.h"

#define calibrator 3420.0

char str2[5];
unsigned int gatetime = 2500; // in ms
float value;

int main()
{
// D I S P L A Y - A N Z E I G E //
lcd_init();

_delay_ms(300);

lcd_send(COMMAND, LCD_CLEAR);
lcd_set_cursor(1, 0); lcd_write("v:");
lcd_set_cursor(1, 13); lcd_write("m/s");

while (1)
{

// M E S S U N G W I N D G E S C H W I N D I G K E I T //
value = 0; // start counter
cbi(DDRB,1); // PB1 as input
TCNT1 = 0; // reset counter
// Ext. Clock @ T1, rising edge
TCCR1B = (1<<CS02)|(1<<CS01)|(1<<CS00);
_delay_ms(gatetime); // wait one gate period
value = TCNT1;
TCCR1B = 0; // stop counter
value = calibrator*value / gatetime;
dtostrf(value, 5, 1, str2); lcd_set_cursor(1, 6); lcd_write(str2);

} // While-Schleife

return 0;

}
 
Ohne mal durch Deinen Code gesehen zu haben: was ist Dein Problem? So ein reed ist ja eigentlich nur ein magnetisch betätigter Taster. Hast Du das Kontaktprellen bedacht? Taster am sinnigsten an einen Pin mit DDR als Eingang und Port=high - dann ist der interne Pullup aktiviert. Den reed/Taster dann gegen Gnd. Wenn das entsprechende Pin-Register-Bit=0 (gepollt, per IRQ, whatever) liegt eine Betätigung (bzw das Prellen) vor.
Alternative zu reeds wären nicht prellende Hall-Sensoren.
 
C kann ich leider nicht, hat aber mit der Beschaltung ja nichts zu tun.
Ich "ziehe" Taster auf Masse mit einem 1K oder 10K- Pullup- Widerstand nach Vcc.
 
Danke

C kann ich leider nicht, hat aber mit der Beschaltung ja nichts zu tun.
Ich "ziehe" Taster auf Masse mit einem 1K oder 10K- Pullup- Widerstand nach Vcc.

Hallo,
danke für die Info. Es war das Schalterprellen - hab ich nicht daran gedacht. Hat mit Deinem Vorschlag nun funktioniert.
DANKE.
Gruß
Marco
 
Hi Marco,

Es war das Schalterprellen - hab ich nicht daran gedacht.
genk dran ... selbst mit nem PullUp oder PullDown-Widerstand hast du immer noch Prellen. Das bekommst du nur über Software oder ne Schaltungsänderung (zusätzlicher Kondensator, RS-FlipFlop, ...) raus.

Gruß
Dino
 
Hi Marco,
Hallo,
danke für die Info. Es war das Schalterprellen - hab ich nicht daran gedacht. Hat mit Deinem Vorschlag nun funktioniert.
DANKE.
Gruß
Marco

freut mich, daß ich auch mal helfen konnte.
Bei meinem letzten Test - äh, laaaaange vor Weihnachten - hab ich noch eine kleine Wartezeit eingebaut. Probleme hab ich da eigentlich nicht. Beim "Taster Ziehen" auf Masse mit R nach Vcc wird der Atmel etwas weniger belastet.
 
Die internen pullups haben AFAIK 20 bis 50 Kiloohm - also werden da beim Tastendruck auch nur max 250µA aus dem Port gelutscht. Ich sehe da keine nennenswerte Last. Wenn ich mir den Code so zurechtinterpretiere, hatte er die internen pullups nicht aktiviert, und scheinbar auch keine externen dran...
Mit Entprellung hat das ganze bisher nix zu tun...

Btw: warum wird eigentlich das DDR-bit von B1 in jedem Schleifendurchlauf gelöscht? Erstens sollte es doch dafault 0 sein, und zweitens wird es nie gesetzt (oder hab ich was übersehen?)
Wenn Du sowieso den Wert des Zählers nehmen willst, warum dann den reed nicht direkt über Input-capture auswerten? Möglicherweise gibts da sogar den passenden CTC-Mode. Und dann ICR nach dem entsprechenden Interrupt Auswerten - geh im Datenblatt (dem langen) mal den Abschnitt des Timers durch.
 
Hallo,

Allgemein, auch beim Schalten von Led's. Das Thema hatten wir schon mal. Bin jetzt aber zu faul zum Suchen...

ein Atmel kann nach GND etwas mehr schalten als gegen Vcc. Darum sollte man theoretisch die LED eher gegen Vcc anschließen.

Beim Eingang sollte man aus Stromspargründen eher den internen PullUp verwenden. Außerdem sollte man an allen unbeschalteten Pins auf Eingang mit PullUp schalten um unkontrolliertes Schwingen zu unterdrücken. Das ist so die Info die ich kenne.

Für genaueres müßte ich jetzt die Datenblätter und ApplicationNotes durchblättern.

Gruß
Dino
 
Ähh...ja...Led's schalten..mit nem 10K (0.5mA) vor dem Transistor kein Problem...reicht da immer absolut aus...ok, ich mach viel zu wenig, brauch wieder mehr Übung...bald....
 
Ähh...ja...Led's schalten..mit nem 10K (0.5mA) vor dem Transistor kein Problem..
:confused: Ich nehme da eher ...
Pin------1,2k-------LED(K)--|<--LED(A)-------Vcc
Allerdings ist es mit 1,2k als Vorwiderstand für ne LED (der reicht absolut aus) relativ piepegal ob du nun nach ...
- Die LED an Vcc anschließt und die Kathode am Pin liegt (mit 0 im Portx einschalten) .... oder ....
- Die LED an GND anschließt und die Anode am Pin liegt (mit 1 im Portx einschalten).
Wer läßt seine LEDs schon mit 10-20mA laufen ? (außer Pollin :p :rolleyes:)

Gruß
Dino
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)