Forum: Mikrocontroller und Digitale Elektronik Zählerztände vom mega32 auslesen lassen


von Basti A. (koldat)


Lesenswert?

hallo;


Ich hab eine digitale uhr aufgebaut . sie verfügt über 13 ausgäne. diese 
sollen als eingänge mit einem µc_system (mega32) ausgelen und als 
Textmeldung in einem Bildschirm (hyperterminal) im format HH:MM 
erscheinen.
was muss ich als ertens tun damit ich die aktuelle uhrzeit auslesen 
lass, da der PINB5 wird gemeinsam vom prallelen Port und von den 
10er-stunden benutzt?

ich freu mich auf jeden hinweis der mich einen schritt weiter nach vorn 
bringt.

von Hubert G. (hubertg)


Lesenswert?

Wie wäre es mit einem Schaltplan von dem was du aufgebaut hast. 
Parallelport, Hyperterminal klingt alles ein bisschen eigen.

von Peter D. (peda)


Lesenswert?

Bastian Alam schrieb:
> Ich hab eine digitale uhr aufgebaut . sie verfügt über 13 ausgäne. diese
> sollen als eingänge mit einem µc_system (mega32) ausgelen und als
> Textmeldung in einem Bildschirm (hyperterminal) im format HH:MM
> erscheinen.

Du weißt aber schon, daß der ATmega32 interne Timer hat, mit denen man 
Zeit, Tag, Jahr, Schaltjahr, Sommerzeit selber zählen kann.
Man muß da nix extra ranpappen außer nen Quarz.

Noch einfacher wäre natürlich, statt auf Hyperterminal, unten rechts auf 
die Taskleiste zu klicken.


Peter

von Basti A. (koldat)


Lesenswert?

das wäre schon eine Möglichkeit. das weiss ich schon aber der takt ist 
schon durch NE555 erzeugt.

von Gast (Gast)


Lesenswert?

Schaltplan?

von Karl H. (kbuchegg)


Lesenswert?

Bastian Alam schrieb:
> das wäre schon eine Möglichkeit. das weiss ich schon aber der takt ist
> schon durch NE555 erzeugt.

Du kannst auch den NE555 an deinen Mega32 pappen und dessen Schwingungen 
mitzählen.
Allerdings hast du mich jetzt neugierig gemacht. Wie erzeugst du mit 
einem 555 eine Schwingung, die in der Frequenz genau genug ist, dass 
deine Uhr nicht schon nach 5 Minuten horrend falsch geht?

von Basti A. (koldat)


Angehängte Dateien:

Lesenswert?

so kann man die minuten betrachten . der erste zähler würde nur bis 5 
und 2 te bis 9 zählen. die anschlüsse müssen vom mega32 ausgelesen. mehr 
ist nicht. der takt mit 555 läuft super...

von Basti A. (koldat)


Lesenswert?

zwischen µc und 555 sind die Teiler und zähler beschaltet.

von Hubert G. (hubertg)


Lesenswert?

Und für was brauchst du da noch den Mega32, oder umgekehrt, für was das 
ganze 555 und Teiler wenn du einen Mega32 hast. Ist irgenwie nicht ganz 
schlüssig.

von Basti A. (koldat)


Lesenswert?

um ein heitzungssystem ein und auszuschalten. die digitaluhr ist ein 
bestandteil der heizunssteurung.

von spess53 (Gast)


Lesenswert?

Hi

>die digitaluhr ist ein bestandteil der heizunssteurung.

Mit einem 555????

MfG Spess

von Magnus Müller (Gast)


Lesenswert?

spess53 schrieb:
> Mit einem 555????
>
> MfG Spess

Ist bestimmt nur ein Spess ;)

von Falk B. (falk)


Lesenswert?

@  spess53 (Gast)

>>die digitaluhr ist ein bestandteil der heizunssteurung.
>Mit einem 555????

Ist ne jamaikanische Uhr, dort sieht man das mit der Zeit viiiiiel 
relaxter ;-)

http://www.arte-di-bianca.de/image/pause_auf_jamaika.gif

MfG
Falk

von spess53 (Gast)


Lesenswert?

Hi

>Ist ne jamaikanische Uhr, dort sieht man das mit der Zeit viiiiiel
>relaxter ;-)

Und die Funktion einer Heizung dürfte man noch wesentlich relaxter 
sehen.

MfG Spess

von Basti A. (koldat)


Lesenswert?

ich kann schon die uhr ohne das "spess" programmieren, aber es wurde im 
projekt verlangt dass der µc die PINs von der uhr lesen soll. nachdem 
ich diese aufgabe erledigt habe muss ich die nächste tun dh ohne spess. 
einverstanden.
könnt ihr mir bitte zeigen wie ich das tun soll.??

von spess53 (Gast)


Lesenswert?

Hi

Dann hänge einfach an die Ausgänge der 4026 an jeweils einen Port vom 
ATMega32. Noch eine Umrechnung von 7-Segment nach Dezimal (z.B. case) 
und fertig.
Was ist da so schwer dran?

MfG Spess

von kuckuck (Gast)


Angehängte Dateien:

Lesenswert?

Wir im Black Forest haben die genauere Uhr ;-)

von Peter D. (peda)


Lesenswert?

Bastian Koli schrieb:
> ich kann schon die uhr ohne das "spess" programmieren, aber es wurde im
> projekt verlangt dass der µc die PINs von der uhr lesen soll. nachdem
> ich diese aufgabe erledigt habe muss ich die nächste tun dh ohne spess.
> einverstanden.
> könnt ihr mir bitte zeigen wie ich das tun soll.??

Du mußt Dir einen inversen 7-Segment Dekoder programmieren 
(Lookup-Table).


Mit dem 555 wirst Du vielleicht die Genauigkeit einer Kerzenuhr (900 n. 
Chr.) erreichen.
Der Mega32 ist mit Quarz mindestens 10000-mal besser.

Man baut einfach keine Uhren mit nem 555, das ist grober Unfug.


Peter

von Magnus Müller (Gast)


Lesenswert?

Peter Dannegger schrieb:
> Man baut einfach keine Uhren mit nem 555, das ist Unfug.

Na ja, für ne Eieruhr könnte er noch reichen ;)

von Basti A. (koldat)


Lesenswert?

ich bin damit einverstanden ihr habt alle recht. ich MUSS das tun. also 
muss ich irgendwie ein schritt weiter komm. wäre es richtig wenn ich die 
Makros so definiere.

#define MIN_EINER PINA&0xF0
#define MIN_ZEHNER PINA&0x0E
#define STD_EINER PINB&0x0F
#define STD_ZEHNER PINB&0x30

von Karl H. (kbuchegg)


Lesenswert?

Bastian Koli schrieb:
> zwischen µc und 555 sind die Teiler und zähler beschaltet.

Nicht böse sein.
Aber was du da hast, ist einfach nur grober Unfug.

Du brauchst keinen 555, du brauchst keine BCD Dekoder.
Du brauchst einfach nur den Mega32 (der für diesen Zweck hoffnungslos 
überdimensioniert ist, aber was solls), die 7-Segment Anzeigen und ein 
bischen Hühnerfutter rundherum.

Und natürlich ein Programm.

deutlich weniger Bauteile
deutlich bessere Genauigkeit
deutlich einfacheres Programm

von Karl H. (kbuchegg)


Lesenswert?

Und zu guter letzt:

Du bist schneller fertig, wenn du das bisherige, völlig verkorkste 
Konzept über Bord wirfst und das ganze richtig machst.

Manchmal muss man auch akzeptieren, dass man sich verrant hat. Oder das 
das bisherige Konzept einfach nicht mehr tragfähig genug ist und 
geändert werden sollte.
Das Design (wenn wir mal den 555 aussen vor lassen) mag ja irgendwann 
einmal vernünftig gewesen sein, aber jetzt ist es am Ende angelangt. Da 
hilft dann auch das Drankleben von Erweiterungen mit Klebeband nichts 
mehr.

von spess53 (Gast)


Lesenswert?

Hi

>wäre es richtig wenn ich die Makros so definiere....

Nein. Deine Information ist jeweils in 7 Bit enthalten.

MfG Spess

von Basti A. (koldat)


Lesenswert?

hi

>Nein. Deine Information ist jeweils in 7 Bit enthalten.


7 bits nur für die minuten 6 für die stunden.

vom obigen spess abgesehen nehmen wir an die 13 bits sind alle eingänge, 
muss ich jetzt den µc konfigurieren oder es reicht wenn ich die Funktion 
init(); einbinde???

zum beispiel:
DDRA=0x01; // PINA1 als ausgang alle anderen als eingänge.
DDRB=0xC0; // ...


mfg speeeeeeeeess

von Karl H. (kbuchegg)


Lesenswert?

Bastian Koli schrieb:
> hi
>
>>Nein. Deine Information ist jeweils in 7 Bit enthalten.
>
>
> 7 bits nur für die minuten 6 für die stunden.

Wie kommst da drauf?

Ich denke du willst dich doch vor die 7-Segment Anzeigen klemmen, oder 
etwa nicht (zumindest ist aus deinem obigen Schaltbild nicht erkennbar, 
wie du es sonst lösen könntest)

Das bedeutet aber auch, dass du pro Stelle 7 Leitungen überwachen 
musst.
Du brauchst also
   Stunden    Einer   7 Leitungen
              Zehner  7 Leitungen
   Minuten    Einer   7 Leitungen
              Minuten 7 Leitungen

Macht in Summe 28 Leitungen, die du überwachen musst und deren Zustand 
du auswerten musst, um zu wissen, was da gerade an der Anzeige angezeigt 
wird.

Was denkst du eigentlich, warum hier alle sagen, dass das Konzept eine 
ausgemachte Schnapsidee ist? Sowas macht man nur, wenn es gar nicht 
anders geht, wenn man zb einem teuren Messgerät auf die Finger schauen 
muss. Aber doch nicht bei einer Uhr, die für für einen angehenden 
Programmierer eine Übungsaufgabe darstellt und schneller programmiert 
ist, als du die 28 Leitungen anschliessen kannst.

von Karl H. (kbuchegg)


Lesenswert?

Ich hab mir den Thread jetzt nochmal durchgelesen.
Deine Angaben im Eröffnungsposting und dein 'Schaltplan' passen hinten 
und vorne nicht zusammen.

Ich hab schon Verständnis, dass du das aus irgendeinem Grund so machen 
MUSST. Ob das nun sinnvoll ist oder nicht.

Aber ehe das fröhliche Spekulieren, wie man das ganze in Code umsetzen 
kann, weitergeht, wäre es vernünftig, wenn du erst mal tatsächlich einen 
aktuellen Schaltplan postest. Und zwar von der Schaltung die da 
aufgebaut ist und nicht von einer die so ähnlich aussieht!

Vielleicht gibt es ja eine Möglichkeit sich an die Zähler zu klemmen und 
die Zeit von dort abzunehmen.

(Obwohl mein persönlicher Favorit immer noch ist: Die Leitungen zu den 
7-Segmenten direkt ziehen und dann klammheimlich die Zuleitungen von der 
vorhandenen Schaltung mit einem kleinen Messerchen ....)

von Basti A. (koldat)


Lesenswert?

HI;

das ist nicht mein schaltplan er ist nur zum veranschaulichen, mein 
richtiger schaltplan beinhaltet 4 teiler sie teilen 500hz (555) bis auf 
eine sekunde. 4 zähler, sie haben jeweils 4, 3, 4,2 ausgänge 4 für 
minuten_einer 3 für minuten_10ner 4 std_1er 2 sdt10er. ja stimmt die 
zeit wird von den zählern abgenommen. Diese ausgänge müssen von Mg32 
ausgelesen und als ausgabe auf einen monitor (Hyperterminal) so 
wiedergegeben:


Bitte geben sie die uhrzeit im format HH:MM
Es ist jetzt 16:04

mfg

von Magnus Müller (Gast)


Lesenswert?

Bastian Koli schrieb:
> das ist nicht mein schaltplan , mein richtiger schaltplan beinhaltet 4

Was bist denn DU für ein HELD ?

Und warum postest du dann zuerst einen völlig anderen Schaltplan und 
lässt uns hier die Köpfe rauchen?!?

Leute gibts... also wirklich!

von Basti A. (koldat)


Lesenswert?

sorry ich hab gestern einen text drüber gepostet aber er ist nicht zum 
erscheinen gekommen.

von Basti A. (koldat)


Lesenswert?

ich hoffe ich hab euch nicht entäuscht.

von spess53 (Gast)


Lesenswert?

Hi

>sie haben jeweils 4, 3, 4,2 ausgänge 4 für minuten_einer 3 für >minuten_10ner 4 
std_1er 2 sdt10er.

Willst du uns veralbern? Deine Leitungszuordnung ist nicht 7-Segm. 
sondern BCD. Also sind zwischen Zähler und Anzeige noch Decoder. Weshalb 
postest du ein total irreführendes Schaltbild.

MfG Spess

von Magnus Müller (Gast)


Lesenswert?

@spess53:

Meine Rede ;)

von Basti A. (koldat)


Lesenswert?

ich muss einen schaltplan posten

von spess53 (Gast)


Lesenswert?

Hi

>ich muss einen schaltplan posten

????????????????????????????????

von Basti A. (koldat)


Lesenswert?

hi

>Deine Leitungszuordnung ist nicht 7-Segm.
sondern BCD

aber das spielet überhaupt keine rolle. ich hab die ganze zeit gefragt, 
was muss ich dem µc in einem C-compiler mitteilen  das er mir den 
zählerstand abliest?

bauteile: dezimalzähler 0bis9, µcsystem mega32.
wenn man Q1-4 an einen Port schließt, sollte der zählerstand abgelesen 
werden, und als textmeldung in einem bildschirmmenü erscheinen.

ich veralban hier niemand ... ich möchte einfach dies hinkriegen und 
vielen dank noch ma.

mfg basti

von Z8 (Gast)


Lesenswert?

@ Falk Brunner (falk)

>>>die digitaluhr ist ein bestandteil der heizunssteurung.
>>Mit einem 555????

>Ist ne jamaikanische Uhr, dort ..

hab schon Quarz-Oszillatorn mit einem 555 gesehen!

Man braucht eigendlich nur einen Negator (Phasenschieber) und
einen Verstärker und schon schwingts. Beides hat ein 555
"on Chip".

mfg Z8 :)

von spess53 (Gast)


Lesenswert?

Hi

>aber das spielet überhaupt keine rolle.

Das spielt eine grosse Rolle. 7-Seg-Code ist eine willkürliche Zuordnung 
der Zahl auf die Segmentdarstellung. Ohne die Kenntnis dieser Zuordnung 
ist eine Decodierung unmöglich. BCD ist die Zahl.

>ich veralban hier niemand

Aber gewaltig!

>ich möchte einfach dies hinkriegen und

Dann papp die Leitungen an den Controller, Lies die Werte ein. Dann 
ASCII-Zeichen draus machen. Einen String basteln und an den PC senden.

MfG Spess

von Basti A. (koldat)


Lesenswert?

hi,
genau, das ist die grosse frage !!!! >lies die werte ein.

 wenn ich wüsste wie das funktionieren sollte  hätte ich wirklich 
niemand veralbant.
was muss ich als ertens tun damit der controller die werte abliest?
 danke

von Falk B. (falk)


Lesenswert?

@  Bastian Koli (koldat)

>was muss ich als ertens tun damit der controller die werte abliest?

Dich mal mit allergrundlegensten Grundlagen befassen.

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Zugriff_auf_IO-Ports

http://www.mikrocontroller.net/articles/AVR-Tutorial
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial

MFG
Falk

von Magnus Müller (Gast)


Lesenswert?

spess53 schrieb:
>>ich veralban hier niemand
>
> Aber gewaltig!

Ich würde es mal so ausdrücken: Er veralbert uns aufgrund seiner 
Unwissenheit. Und das gewaltig ;) ...aber immerhin unbeabsichtigt.

Bastian Koli schrieb:
> hi,
> genau, das ist die grosse frage !!!! >lies die werte ein.
>
>  wenn ich wüsste wie das funktionieren sollte  hätte ich wirklich
> niemand veralbant.
> was muss ich als ertens tun damit der controller die werte abliest?
>  danke

Zuerst einmal wäre es von Vorteil die Ausgänge der Zähler mit den 
Eingängen des µCs zu verbinden.

Mein Vorschlag:

Minuten Einer  Q0 --> PA0
Minuten Einer  Q1 --> PA1
Minuten Einer  Q2 --> PA2
Minuten Einer  Q3 --> PA3

Minuten Zehner Q0 --> PA4
Minuten Zehner Q1 --> PA5
Minuten Zehner Q2 --> PA6

Stunden Einer  Q0 --> PC0
Stunden Einer  Q1 --> PC1
Stunden Einer  Q2 --> PC2
Stunden Einer  Q3 --> PC3

Stunden Zehner Q0 --> PC4
Stunden Zehner Q1 --> PC5

Als nächstes schreibst du dir ein Programm, welches die Ports abfrägt, 
auswertet und über den USART an den PC schickt.

Gruß,
Magnetus

von Basti A. (koldat)


Lesenswert?

hi;
oder so:

 MIN_EINER PINA&0xF0
 MIN_ZEHNER PINA&0x0E
 STD_EINER PINB&0x0F
 STD_ZEHNER PINB&0x30
mfg

von Magnus Müller (Gast)


Lesenswert?

@Bastian Koli:

Wie auch immer du willst...

von Karl H. (kbuchegg)


Lesenswert?

Bastian Koli schrieb:
> hi;
> oder so:
>
>  MIN_EINER PINA&0xF0
>  MIN_ZEHNER PINA&0x0E
>  STD_EINER PINB&0x0F
>  STD_ZEHNER PINB&0x30
> mfg

Du musst dich erst mal mit den Grundlagen der Programmierung 
beschäftigen. Einen µC programmieren ist ein klein wenig anders, als 
einen Kondensator an einen 555 anzuschliessen.

Du musst da durch. Es hat keinen Sinn weiterzumachen, solange du bei den 
Grundlagen scheiterst. Und einen Port einzulesen sind Grundlagen. Erste 
Stunde, gleich nach der Einführung kommt alles Wissenswerte um mit einem 
Port umzugehen.

Schau endlich ins Tutorial! Besser wäre es allerdings, wenn du auf einem 
PC mal deine ersten paar Programme schreibst.

> Bitte geben sie die uhrzeit im format HH:MM
> Es ist jetzt 16:04

Auf das Drama, die Zähler mit der aktuellen Uhrzeit hochzutakten freu 
ich mich jetzt schon.

von Basti A. (koldat)


Lesenswert?

hi,
>Einen µC programmieren ist ein klein wenig anders, als
>einen Kondensator an einen 555 anzuschliessen.

das weiss ma schon.aber wenn man nicht weiterkommt, ein kleiner hinweis 
schadet niemand.

von Magnus Müller (Gast)


Lesenswert?

Bastian Koli schrieb:
> das weiss ma schon.aber wenn man nicht weiterkommt, ein kleiner hinweis
> schadet niemand.

Hinweise hast du ja jetzt schon bekommen. Wenn du konkrete Fragen hast, 
kannst du sie ja hier wieder stellen.

von Basti A. (koldat)


Lesenswert?

hi,

>Wenn du konkrete Fragen hast,kannst du sie ja hier wieder stellen.

ich hoffe ...

headers


#define MIN_EINER PINA&0xF0  //auslesen des aktuellen Zustands
#define MIN_ZEHNER PINA&0x0E
#define STD_EINER PINB&0x0F
#define STD_ZEHNER PINB&0x30


void main void
{

unsigned char zae1, zae2, zae3, zae4;

DDRA=0x00;
PORTA=0xFE;

DDRB=0xC0;
PORTB=0X3F;
init(); //Kommunikation über RS232


while(1)
{
if(MIN_EINER==zae1) zae1++; ???


.




//hier muss ich die Zahlen in Ascii zeichen umwandeln wie??

printf("\n\r%2d:%2d");

}
}

}

mfg

von Karl H. (kbuchegg)


Lesenswert?

Bastian Koli schrieb:

> #define MIN_EINER PINA&0xF0  //auslesen des aktuellen Zustands

Solche #define sind keine gute Idee
Da versteckt sich nämlich nur allzuleicht ein Fehler ...

> if(MIN_EINER==zae1) zae1++; ???

der sich hier bemerkbar macht.
Wenn der Präprozessor seine Arbeit gemacht hat und die Textersetzungen 
vorgenommen hat, dann steht da ...
1
  if( PINA & 0xF0 == zae1 )

... und laut C-Regeln wird das so geparst
1
  if( PINA & ( 0xF0 == zae1 ) )

nicht ganz das was du willst.

Entweder man macht daher beim #define ein paar Klammern mehr (PS: 
Leerzeichen kosten nichts, können aber ungemein beim Verständnis eines 
Codes helfen)
1
#define  MIN_EINER ( PINA & 0x0F )

oder aber man macht kein derartiges Rundumschlagmakro, sondern dröselt 
sich das ein wenig auf
1
#define MINUTE_PORT   PINA
2
#define MINUTE_EINER  0xF0
3
#define MINUTE_ZEHNER 0x0E

und schreibt dann
1
....
2
3
   if( ( MINUTE_PORT & MINUTE_EINER ) == zae1 )

Was willst du eigentlich mit zae1. Wenn du vom Minuten Port die 
entsprechenden Pins holst, dann hast du bereits im Prinzip deine Zahl. 
Sie ist nur um 4 Bits vershoben, im High Byte. Es reicht also völlig, 
wenn du sie um 4 Bits nach rechts verschiebst um eine Zahl zwischen 0 
und 16 zu bekommen. Damit hast du dann die Einerstellen deiner Zahl

Dasselbe nochmal für die Zehnerstelle (diesmal ohne Schieben), und schon 
bist du soweit fertig, dass du die Zehner und die Einer als einzelne 
Ziffern aber bereits in Zahlenform hast. Daraus muss man jetzt nur noch 
die tatsächlichen Minuten zusammensetzen. Das ist aber einfach. Wenn du 
als Zehner 2 und als Einer 5 hast, dann lautet die Zahl 10 * 2 + 5 = 25

In Code
1
int main()
2
{
3
  uint8_t MinEiner;
4
  uint8_t MinZehener;
5
  uint8_t Minuten;
6
7
 ....
8
9
  while( 1 )
10
  {
11
    MinEiner  = ( MINUTE_PORT & MINUTE_EINER ) >> 4;
12
    MinZehner = ( MINUTE_PORT & MINUTE_ZEHNER );
13
14
    Minuten = 10 * MinZehner + MinEiner;
15
16
    ... Umwandeln nach ASCII
17
    ... Ausgeben per RS232

Für den Schritt "Umwandeln nach ASCII" schaust du dir das hier an

http://www.mikrocontroller.net/articles/FAQ#Wie_kann_ich_Zahlen_auf_LCD.2FUART_ausgeben.3F

von Basti A. (koldat)


Lesenswert?

hi;

>>>Minuten = (10 * MinZehner + MinEiner)|0x30;

danke schön, diese Zeile hat mir viel geholfen.

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.