Forum: Mikrocontroller und Digitale Elektronik Entprellen Systick Debounce STM32


von hans (Gast)


Lesenswert?

Hallo leute,

ich würde gerne eine funktion schreiben welche mittles 
"systick-interrupt" und dem in- bzw. dekremetieren der Schaltzustände 
für das Entprellen mehrerer Taster sorgt.

ich hab hier 
http://www.emcu.it/STM32/STM32Discovery-Debounce/STM32Discovery-InputWithDebounce_Output_UART_SPI_SysTick.html 
dazu entsprechende Codeschnipsel gefunden -> soweit so gut, verstehe 
auch was der Code tut.

Ich würde jetzt aber gern basierend auf diesen Codeschnipseln eine 
Funktion erstellen welcher im Funktionskopf der Port und der Pin 
übergeben wird und als Rückgabewert eine 1 od. 0 liefert.

z.B.: Pin 1 am PortC soll entprellt/ausgelesen werden.
Funktionsaufruf sollte sinngemäß so aussehen: Debounce(GPIOC,1)
Ich weiß dass der Funktionskopf jenem von
1
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
 ähnelt(bis auf den zeiger). Ich hab auch versucht diese Funktion 
"umzubauen" => es folgten (für mich) unschlüssige Compiler 
Fehlermeldungen :-(
In der Funktion selber sollte dann das erste Bit aus GPIOC->IDR 
ausgelesen werden.

INFO: die Ports/Pins/Systick Interrupt funktionieren an sich wie 
gewünscht => scheint also alles richtig konfiguriert(wurde direkt über 
die Register gemacht und nicht mit den Libfunktionen) zu sein!

Ich nehme an, dass das Problem nur auf meiner Unkenntis 
beruht(kämpfe/google mit dem Problem schon bald 3 Tage). Für einen 
STM32/C-Kundigen nehm ich an wird das sicher kein Problem sein => würde 
mich über sinnvolle Vorschläge freuen!

Danke mfg Hans

von Peter D. (peda)


Lesenswert?

hans schrieb:
> es folgten (für mich) unschlüssige Compiler
> Fehlermeldungen :-(

Immerhin kennst Du aber im Gegensatz zu uns deren exakten Wortlaut und 
die dazu gehörende Codezeile(n).

Und Prosa ist der schlechteste Weg, einen Programmcode zu publizieren.
Dazu ist der Dateianhang da (compilierbaren und linkbaren Code posten!).

von hans (Gast)


Lesenswert?

Völlig richtig Code bzw. Compilermeldungen wären hilfreich, nur hab ich 
daran schon so viel herumgebastelt dass davon nix mehr übrig ist!

Ich habe halt die naive Vorstellung, dass schon mal jemand eine 
"universelle" Funktion geschrieben hat, welche über die beiden 
Eingabeparameter das entsprechende IDR Bit ausliest bzw. entprellt.

Sorry
mfg

von Peter D. (peda)


Lesenswert?

hans schrieb:
> Funktionsaufruf sollte sinngemäß so aussehen: Debounce(GPIOC,1)

Das geht nicht.
Ein nicht blockierendes Entprellen benötigt 2 Teile:
- Den Timerinterrupt, der entprellt und entsprechende Ereignisse 
(Flankenwechsel) bereitstellt
- Der Mainfunktion, die dann nur noch die Ereignisse abholt und löscht.

Der Timerinterrupt muß also schon wissen, welche Pins er alle entprellen 
soll.
Das Main kann dann entscheiden, welches Bit (= Taste) es maskieren, also 
auswerten will.

Bequemer Weise macht man die Entprellung auf ner 32Bit-CPU für 32Bit 
parallel, auch wenn es weniger Tasten sind oder nur eine.

Man kann aber auch ein Array anlegen, wo alle Tasten nacheinander 
entprellt werden. Das ist allerdings erheblich aufwendiger.

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.