Zählerztände vom mega32 auslesen lassen

OP #1286932
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.
#1286954
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
#1286993
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?
OP #1287371
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.??
#1287421
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
OP #1287460
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
#1287470
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
#1287476
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.
OP #1287911
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
#1287957
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.
#1288016
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 ....)
OP #1288193
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
Gast #1288201
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!
Gast #1288219
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
OP #1288425
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
Gast #1288438
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 :)
Gast #1288441
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
Gast #1288485
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
#1288796
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.
Gast #1290099
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.
OP #1290144
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
#1290871
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren