Forum: Mikrocontroller und Digitale Elektronik Cm in Inch per Tastendruck auf LCD Display


von steffi (Gast)


Lesenswert?

Guten Tag, ich arbeite momentan an einem Projekt für die Schule. Das 
Projekt heißt Distanzmesser (mit HC-SR04, Atmega32-16pu und 
Ultraschallsensor), ihr wisst wahrscheinlich was es machen muss, wenn 
nicht, es soll den Abstand zwischen dem Sensor und einem Objekt messen 
und auf das Display transferieren. Jetzt muss ich einen Taster 
hinzufügen und nach dem drücken soll der Abstand in Inch angezeigt 
werden. Jedoch bin ich momentan planlos und bräuchte eure Hilfe. Die 
Taste ist mit PINB3 verbunden und hat einen Pullup Wid von 10kOhm.

Code bis jetzt:
1
#define F_CPU 1000000UL
2
3
#include <asf.h>
4
#include <avr/io.h>
5
#include <MrLcd/MrLCDATmega32.h>
6
#include <avr/interrupt.h>
7
#include <util/delay.h>
8
#include <stdlib.h>
9
10
static volatile int pulse = 0;
11
static volatile int i = 0;
12
static volatile int modus = 0; //0=cm, 1=inch //Habe das vorgeschlagen bekommen
13
14
int main (void)
15
{
16
  int16_t count_a = 0;
17
  char show_a[16];
18
  Initialise();
19
  DDRD = 0b11111011;
20
  _delay_ms(50);
21
  
22
   Initialise();
23
24
   GICR |= 1<<INT0;
25
   MCUCR |= 1<<ISC00;
26
27
   sei();
28
29
while(1)
30
{
31
    
32
    PORTD |= 1<<PIND0;
33
    _delay_us(15);
34
35
    PORTD &= ~(1<<PIND0);
36
    count_a = pulse/58;
37
38
    Send_A_String("Distance Sensor");
39
    GoToMrLCDLocation(1,2);
40
    Send_A_String("Distance=");
41
    itoa(count_a,show_a,10);
42
    Send_A_String(show_a);
43
    Send_A_String(" ");
44
    GoToMrLCDLocation(13,2);
45
    Send_A_String("cm");
46
    GoToMrLCDLocation(1,1);
47
    
48
    if ( PINB & (1<<PB3) )
49
    {
50
      
51
    }
52
    else
53
    {
54
55
    }
56
  }
57
}
58
59
ISR (INT0_vect)
60
{
61
  if(i==0)
62
  {
63
    TCCR1B |= 1<<CS10;
64
    i=1;
65
  }
66
  else
67
  {
68
    TCCR1B = 0;
69
    pulse = TCNT1;
70
    TCNT1 = 0;
71
    i=0;
72
  }
73
}

LG

: Bearbeitet durch Moderator
von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

steffi schrieb:
> Jedoch bin ich momentan planlos und bräuchte eure Hilfe.
Du solltest selber mal etwas ausprobieren und bei spezifischen Problemen 
um "Hilfe" fragen. Denn "Hilfe" bedeutet nicht "Alles vormachen und 
fertig gelöste Hausaufgabe präsentieren".

> Die Taste ist mit PINB3 verbunden und hat einen Pullup Wid von 10kOhm.
Welchen Pegel hat also der Pin B3, wenn die Taste gedrückt oder nicht 
gedrückt ist? Wie liest man so eine "low-aktive" Taste ein? Es gibt 
tausende Beispiele dafür...

Du kannst dir dann auch gleich mal die Themen "Entprellen" und 
"Flankenerkennung" ansehen. Du wirst diese Mechanismen brauchen.

Ein Tipp: wenn du den Abstand nur "während der Taster gedrückt ist" in 
Inch anzeigst, dann ist die Umschaltung voll simpel.

> Code bis jetzt:
Bitte künftig die [c] Tags verwenden, wie über jeder Eingabebox gleich 
unter "Antwort schreiben / Wichtige Regeln - erst lesen, dann posten!" 
beschrieben.

: Bearbeitet durch Moderator
von Sebastian R. (sebastian_r569)


Lesenswert?

Mögliche Idee:
Mit einem Flag umschalten, ob cm oder in ausgegeben werden.
In der Schleife schauen, ob der Taster gedrückt ist und wenn ja, das 
flag umschalten und eine kleine Verriegerung setzen, damit wenn der 
Taster gedrückt bleibt, nicht wieder beim nächsten Durchlauf 
umgeschaltet wird.

Gaaaanz grober Pseudocode:
1
While(1)
2
 {
3
   ...
4
   if(unitflag)
5
      print(value "cm")
6
   else
7
      print(value/2.54 "in")
8
9
   ...
10
   if( taste_gedrueckt && !lockout)
11
      unitflag XOR 1
12
      lockout = 1
13
   else
14
      lockout = 0
15
16
 }


Die "optimalste" Lösung wäre natürlich, die Umschaltung in einem 
Timer-Interrupt zu machen. Da kann man dann gleich den Taster entprellen 
und wenn der Taster sicher gedrückt wurde, umschalten

von MaWin (Gast)


Lesenswert?

steffi schrieb:
> Jetzt muss ich einen Taster hinzufügen und nach dem drücken soll der
> Abstand in Inch angezeigt werden.

Unklare Aufgabenbeschreibung, naturlich ist dann unklar wie man das 
löst.

Soll nur während man den Taster drückt die Anzeige auf inch springen und 
nach dem loslassen wieder cm, oder soll jeder Druck auf den Taster 
umschalten zwischen cm und ich und cm ?

Für letzteres brauchst du ein flag (bool'sche Variable des Zustandes) 
und musst die Taste entprellen.


Fur ersteres braucht es nur ein if.

von sid (Gast)


Lesenswert?

MaWin schrieb:
> steffi schrieb:
>> Jetzt muss ich einen Taster hinzufügen und nach dem drücken soll der
>> Abstand in Inch angezeigt werden.
>
> Unklare Aufgabenbeschreibung, naturlich ist dann unklar wie man das
> löst.
>
> Soll nur während man den Taster drückt die Anzeige auf inch springen und
> nach dem loslassen wieder cm, oder soll jeder Druck auf den Taster
> umschalten zwischen cm und ich und cm ?

eigentlich nicht..
da steht doch
"nach dem drücken" also danach!

sonst stünde da doch "beim drücken" also während!
möglicherweise missverständlich wäre
"durch drücken" was beides einschliessen könnte ...während und danach.

Die Frage ist nur, soll durch zweimaliges Drücken die Anzeige wieder
auf vernünftige Werte zurückspringen oder nicht (ich würde das 
hineininterpretieren wollen.. imperial quatsch ist eben das... QUATSCH!)

egal.. interessanter wäre mir die Frage hier,
will man da dezimale inch Anzeige (was leicht wär)
oder will man auch diesen Bruchteil Kokolores,
oder schlimmer noch Mixed

4 1/4" + 0.0807 (oder wie wir sagen würden... 11cm ;))

'sid

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

sid schrieb:
> da steht doch "nach dem drücken" also danach!
Aber da steht eben überhaupt nichts von "Loslassen".
Deshalb kann man es so implementieren, wie du es willst, oder auch 
anders. Beide Lösungen genügen dieser Anforderung vollauf.
Das ist der Witz am Pflichtenheft, da hat schon mancher überrascht 
geguckt.

sid schrieb:
> oder will man auch diesen Bruchteil Kokolores
Den verwenden sogar die Zolligen selber nicht mehr. In Datenblättern 
werden ż. B. 100mm immer als 3,937" angegeben.

von Wolfgang (Gast)


Lesenswert?

Lothar M. schrieb:
> Den verwenden sogar die Zolligen selber nicht mehr. In Datenblättern
> werden ż. B. 100mm immer als 3,937" angegeben.

Dann frag mal in einem Werkzeugladen nach einem Alan Key mit 0.1875" ;-)

von MaWin (Gast)


Lesenswert?

Lothar M. schrieb:
> sid schrieb:
>> oder will man auch diesen Bruchteil Kokolores
> Den verwenden sogar die Zolligen selber nicht mehr. In Datenblättern
> werden ż. B. 100mm immer als 3,937" angegeben

Na ja, als Ganzzahl + Bruch + Nachkommastellen nicht, hab iich auch nur 
1x in meinem Leben gesehen, aber Brüche verwenden die gerne, ob zöllige 
Gewinde ( 1 1/2 ) oder unsere 1/8" Bohrer, 1/16" Blechstärke.

von Christian S. (roehrenvorheizer)


Lesenswert?

"Guten Tag, ich arbeite momentan an einem Projekt für die Schule. "

Hallo,

schon erstaunlich,  was heutzutage in der Schule als Stoff angeboten 
wird. Früher undenkbar. Es zeigt sich auch deutlich die Diskrepanz 
zwischen:
-mal nebenbei mittels Ultraschallsensoren die Distanz ausmessen, 
vermutlich durch Anwendung einer vorgefertigten Bibliothek
-zusätzlich  eine Taste für eine Umschaltung hinzu zu fügen.

Es zeigt sich, daß noch kein Repertoire zur Lösung einfacher 
Programmieraufgaben vorhanden ist. Dies ist um so weniger verwunderlich, 
wenn neben den anderen zu bewältigenden Fächern hier noch Zeit und 
Geduld in die experimentelle Erforschung eines größeren 
Programmierobjektes investiert werden soll.

Die Anleitung zum Mega 32 hat nur 346 Seiten, die man zu Schulzeiten 
unter der Bank schon gelesen haben sollte;-)


Ich empfehle noch den Einbau einer Blink-LED, die bestenfalls auf 
Tastendruck zu- und abschaltbar sein könnte.

MfG

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Wolfgang schrieb:
> Dann frag mal in einem Werkzeugladen nach einem Alan Key mit 0.1875" ;-)
Da wird der Verkäufer sowieso die Brauen hochziehen und fragen, ob seine 
"Allen Keys" die Arbeit auch verrichten könnten.
Aber abseits der traditionellen Maßangaben bei Werkzeugen, Schrauben, 
Rohren,... finden sich diese Dreivierfünftel-Brüche kaum.

von WORAUS (Gast)


Lesenswert?

WORAUS ermittelt dein schlauer Aufbau die cm?
Um Resourcen zu sparen, machen wir die cm -> inch in
Ganzzahlmathematik:

Die reicht vollkommen bei der Ultraschallgeschichte:
Max 400 cm mit Auflösung von 0,5 cm (? eher 1 cm)
Jedenfalls passt 800 in 2 BYTE = 1 WORD

A) cm                      (passt in 1 WORD = 2 Byte)
B) Faktor = 25802          (passt in WORD = 2 Byte)
C) mul16_16 = cm x Faktor  (ergibt LONG = 4 Byte)
D) inch = mul16_16 / 65536 (ergibt WORD: untere 2 Byte abschneiden)

Das wird dir aber nicht helfen, da du garnicht weißt, was der
Sensor und der µC dabei zu tun haben.

Fazit: Du fällst durch - und das ist auch gut so.

von sid (Gast)


Lesenswert?

Lothar M. schrieb:
> Aber da steht eben überhaupt nichts von "Loslassen".
das ist jetzt aber schon arg kleinlich..
"zum starten des Fahrzeugs drehen sie den Schlüssel"
"Zum manuellen öffnen der Türe bitte Taster drücken"
"Zum kopieren Strg+C drücken, zum einfügen Strg+v"
... da steht nix von loslassen NIE!
Dass man Taster irgendwann wieder loslassen sollte ist ja irgendwie
in Fleisch und Blut bei so ziemlich jedem.
Soweit sogar, dass falls man mal nicht loslassen soll für nenenswerte 
Dauer
sich "press and hold" im Erklärtext durchsetzt
oder eben "halte taste xy gedrückt bis<aktion>/für<zeit>"
und DAVON steht da eben auch nichts..
im Gegenteil:
da steht NACH drücken,
"Drücken" ist also vorbei
das impliziert losgelassen, auch sprachlich. ;)

Lothar M. schrieb:
> Aber abseits der traditionellen Maßangaben bei Werkzeugen, Schrauben,
> Rohren,... finden sich diese Dreivierfünftel-Brüche kaum.

Naja, da haben wir also sehr unterschiedliche Erfahrungen...
in jedem Handwerksvideo auf YT (auch von renomierten Handwerkern, keinen 
Hobbyisten - zB Ron Covell) nutzen ihre Freedomunits in Brüchen wo immer 
möglich.
Auch alljene die manuelle Drehbänke und Fräsen beackern, nutzen 
vorranging Brüche, es sei denn sie gehen über den DRO der die nicht 
anzeigen kann
oder nehmen die letzten paar Tausendstel ab;)
(daher kommt ja dieser Mix Mist... 1 3/8" plus paar tausendstel)

Ich hatte zum Glück noch nie das Misvergnügen mit US A-Metrikanern 
zusammen Handwerken zu müssen, reicht schon mit ihnen über Masseinheiten 
diskutieren zu müssen.
Aber egal.

WORAUS schrieb:
> Faktor = 25802

Cool, das ist für den inch-Blödsinn echt nah genug!, danke für den Tipp.
hab ich noch nie drüber nachgedacht, dass das mit ner multiplikation und 
shift gehen könnte.
(macht bei mir kaum einen Unterschied -auf nem PC klappt das mit der 
division ja ausreichend schnell-, ist aber 'nice to know' man weiss ja 
nie wann man das mal brauchen könnte)

'sid

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

sid schrieb:
> hab ich noch nie drüber nachgedacht, dass das mit ner multiplikation und
> shift gehen könnte.
Eine Division durch eine Konstante geht immer mit einer Multiplikation 
und einem Shift. Nur wird für hinreichende Genauigkeit evtl. der 
Integer zu kurz, weil der Binärfaktor zu groß wird. In FPGAs, wo ich die 
Wortbreite ja beliebig gestalten kann mit z.B. 27 bit oder auch 111 Bit, 
geht das recht elegant.
Und dort muss dann auch keine "Bytegrenze" für einen "optimalen Shift" 
eingehalten werden, weil in Hardware ein Shift nur ein "Nichtverdrahten 
von unteren Bits" ist.

Aber ich würde da sowieso nicht mit dem zurechtgerundeten "cm"-Wert 
rechnen, sondern einfach gleich dort ansetzen, wo der Anzeigewert aus 
dem Zählerwert berechnet wird:
1
if (modus) count_a = pulse/147; // modus != 0 -> inch (hier gilt 147 = 58*2,54)
2
else       count_a = pulse/58;  // modus == 0 -> cm (58 dürfte ja schon funktionieren)
Und jetzt muss man nur noch "modus" mit 0 oder 1 beschreiben und man 
bekommt das Ergebnis in ganzzahligen(!!) inch oder in cm angezeigt.


sid schrieb:
> Naja, da haben wir also sehr unterschiedliche Erfahrungen...
> Handwerksvideo auf YT ... manuelle Drehbänke und Fräsen beackern
Ja, ich bin da eher industriell unterwegs. Und in die Tabellen auf den 
Prozessrechnern werden Abmessungen immer in x,y" eingegeben.

sid schrieb:
> das ist jetzt aber schon arg kleinlich..
Das nennt sich "Ausnutzen der Freiheitsgrade".

> Dass man Taster irgendwann wieder loslassen sollte ist ja irgendwie
> in Fleisch und Blut bei so ziemlich jedem.
Das geht sogar soweit, dass so mache Software erst reagiert, wenn man 
die Taste loslässt, obwohl da dick und fett steht, dass man die Taste 
drücken müsse.

steffi schrieb:
> Code bis jetzt
Woher kommt der? Wurde der vorgefertigt und getestet bereitgestellt?

: Bearbeitet durch Moderator
von Ein Freund (Gast)


Lesenswert?

Wieso gibst Du nicht die Quelle "Deiner Entwicklung" preis:

https://electrosome.com/ultrasonic-distance-sensor-atmega32/

?

Hat Dir Dein Post bei den AVR-Freaks etwas eingebracht?

Ich mag es nicht, wenn andere sich mit fremden Federn schmücken "und 
dann nur noch nach Details fragen".

von Joachim B. (jar)


Lesenswert?

sid schrieb:
> das ist jetzt aber schon arg kleinlich..
> "zum starten des Fahrzeugs drehen sie den Schlüssel"
> "Zum manuellen öffnen der Türe bitte Taster drücken"
> "Zum kopieren Strg+C drücken, zum einfügen Strg+v"
> ... da steht nix von loslassen NIE!
> Dass man Taster irgendwann wieder loslassen sollte ist ja irgendwie
> in Fleisch und Blut bei so ziemlich jedem.

aber das reicht nun mal nicht um dem Computer zu erklären was wann 
geschehen soll!

Wenn also

steffi schrieb:
> nach dem drücken soll der Abstand in Inch angezeigt
> werden

dann sollte man das schon mal differenzieren zur Beschreibung:

nach dem Drücken kann heissen, sofort auf Druck passiert was!
nach dem Drücken kann aber auch heissen, sofort auf Loslassen passiert 
was!

Deswegen haben Juristen nie Arbeitsmangel!
Techniker wollen es genauer!

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Joachim B. schrieb:
> dann sollte man das schon mal differenzieren zur Beschreibung:
> nach dem Drücken kann heissen, sofort auf Druck passiert was!
> nach dem Drücken kann aber auch heissen, sofort auf Loslassen passiert was!
Und es kann heißen, dass sowohl beim Drücken wie auch beim Loslassen was 
passiert. So wie bei der Haustürklingel, die sofort nach dem Drücken mit 
dem Klingeln beginnt und sofort nach dem Loslassen wieder aufhört.
Oder so wie das Dämpferpedal beim Keyboard oder bei der Lichthupe oder 
oder oder.

Joachim B. schrieb:
> Techniker wollen es genauer!
Techniker machen das, was der Auftraggeber geschrieben hat. Nur der 
Auftraggeber will es anders(**). Und ...
> Deswegen haben Juristen nie Arbeitsmangel!

(**) Wie die Zeitschaltuhr im Backofen: man stellt die Abschaltzeit 
ein. Und dann noch, wie lange der Ofen vorher zu laufen hat. Ich 
bekomme da immer einen Knoten ins Hirn. Für eine Hausfrau ist die 
Programmierung ganz logisch: der leckere Auflauf braucht eineinviertel 
Stunden und um 12 kommt die ganze Bande an den Tisch, da muss er fertig 
sein.

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.