Forum: Mikrocontroller und Digitale Elektronik PIC 16F84A+SN7447 Wie ansteuern?


von Steffen P. (Gast)


Lesenswert?

Hi,
also ich bin ein absoluter Neuling in Sachen PIC dass erst mal vorraus.
Ich muss als abschlussprojekt für meine Schule ein Thermometer bauen.
So ich habe einen BCD zu 7Segment Decoder den SN74LS47N und 3-7Segment 
Anzeigen mit gemeinsamer Anode die über 3 Transistoren geschaltet werden 
dies ist kein Problem.Mein Problem ist es das ich nicht weiss wie ich 
den SN74LS47N ansteuern wegen dem HIGH und LOW wenn ich nach der Tabelle 
aus dem Datenblatt gehe bekomme ich nichts gescheites dabei herraus!

Kann mir bitte jemand von euch helfen?

mfg
schally

von Severino R. (severino)


Lesenswert?

Du musst /LT, /RBI und /BI auf log. 1 (high) setzen.
a..g an die Kathoden der 7-Segment-Anzeigen,
An A..D legst Du die Daten.
Und natürlich VCC und GND anschliessen.

Viel Spass

Severino

von Steffen P. (Gast)


Lesenswert?

Severino R. wrote:
> Du musst /LT, /RBI und /BI auf log. 1 (high) setzen.
> a..g an die Kathoden der 7-Segment-Anzeigen,
> An A..D legst Du die Daten.
> Und natürlich VCC und GND anschliessen.
>
> Viel Spass
>
> Severino

Kann ich also einfahc hingehn und /LT, /RBI und /BI einfahc an GND 
anschliessen müsste doch auch gehn oder?

mfg
schally

von Severino R. (severino)


Lesenswert?

Nein, die musst Du eben auf z.B. +5V legen.

High = logisch 1 = +5V (VCC)
Low  = logisch 0 = 0V  (GND)

Alles klar?

Severino

von Steffen P. (Gast)


Lesenswert?

Severino R. wrote:
> Nein, die musst Du eben auf z.B. +5V legen.
>
> High = logisch 1 = +5V (VCC)
> Low  = logisch 0 = 0V  (GND)
>
> Alles klar?
>
> Severino

Hi,
danke erstmal .
Ich melde mich gleich wieder.;-)

mfg
schally


von Steffen P. (Gast)


Lesenswert?

So habe nun die netsprechenden Pins an +5V gelötet.
aber wenn ich eine 1 senden will mit dem Assemblerbefehl
BSF IA ;Dezimal 1
sendet er mir nichts !

mfg
schally

ps:
; RB,0 --> BCD/7 Segement Decoder Eingang IA 
*
; RB,1 --> BCD/7 Segement Decoder Eingang IB 
*
; RB,2 --> BCD/7 Segement Decoder Eingang IC 
*
; RB,3 --> BCD/7 Segement Decoder Eingang ID 
*
; RB,4 --> BCD/7 Segement Decoder Eingang LT 
*
; RB,5 -->Transistor 1 für Anzeige 1 zu schalten 
*
; RB,6 -->Transistor 2 für Anzeige 2 zu schalten 
*
; RB,7 -->Transistor 3 für Anzeige 3 zu schalten 
*
;*********************************************************************** 
********

von Severino R. (severino)


Lesenswert?

Du solltest schon etwas mehr als nur eine Instruktion Deines Programms 
posten, da so nicht ersichtlich ist, was IA ist.
Ausserdem setzt bsf nur ein einzelnes Bit. Du musst aber vier Bits 
setzen.
Hast Du Dein Port richtig initialisiert?
Und schliesslich ist ein Schema nützlich, um zu sehen, wohin Deine Bits 
gelangen.

Severino

von Steffen P. (Gast)


Lesenswert?

1
; ******************************************************************************
2
; * Thermometer.asm - Abschlussprojekt HBFI05a von Steffen Schalhorst          *
3
; ******************************************************************************                                                                               
4
; Mit Hilfe des PIC-Mikrocontroller 16F84A soll mit Hilfe des 1-Wire           *
5
; Sensors DS18S20 ein Thermometer aufgebaut werden.                            *
6
; Der PIC bekommt die Daten über den Port RA,0.                                *
7
; Die gemessenen Werte werden BCD codiert und an einen BCD/7-Segement          *
8
; Decoder gesendet der diesen Wert an die Entsprechenden Anzeigen sendet       *
9
; die nacheinander Eingeschaltet werden.                                       *
10
; ******************************************************************************         
11
; EINGÄNGE:                                                                    *
12
;                                                                              *           
13
; RA,0 --> 1-Wire Sensor DS18S20                                                *
14
; RA,1 --> Taster 1 Höchste Temp.                                              *
15
; RA,2 --> Taster 2 Niedrigste Temp.                                           *
16
; ******************************************************************************                                    
17
; AUSGÄNGE:                                                                    *
18
;                                                                              *                                      
19
; RB,0 --> BCD/7 Segement Decoder Eingang IA                                   *
20
; RB,1 --> BCD/7 Segement Decoder Eingang IB                                   *
21
; RB,2 --> BCD/7 Segement Decoder Eingang IC                                   *
22
; RB,3 --> BCD/7 Segement Decoder Eingang ID                                   *
23
; RB,4 --> BCD/7 Segement Decoder Eingang LT                                                                            *
24
; RB,5 -->Transistor 1 für Anzeige 1 zu schalten                               *
25
; RB,6 -->Transistor 2 für Anzeige 2 zu schalten                               *
26
; RB,7 -->Transistor 3 für Anzeige 3 zu schalten                               *
27
;*******************************************************************************
28
29
;*******************************************************************************
30
;* Bestimmung des Prozessortyps für den Assembler und das Programmiergerät     *
31
;*******************************************************************************
32
    LIST p=16F84A
33
;*******************************************************************************
34
;* Includedatei für den 16F84A einbinden (vordef. Reg. und Konst.)             *
35
;*******************************************************************************
36
37
    #include <p16f84A.INC>
38
39
; Diese Datei enthält Vordefinitionen für wichtige Register und Konstanten.
40
; (Z.B. gibt es die Konstante PORTB mit der sich ohne Angabe der
41
; absoluten Adresse H'0006' der Port B des Prozessors ansprechen lässt)
42
43
44
;*******************************************************************************
45
;* Konfigurationseinstellungen für IC-Prog vordefinieren                       *
46
;*******************************************************************************
47
48
    __CONFIG _PWRTE_ON & _CP_OFF & _HS_OSC & _WDT_OFF
49
50
; Hier werden verschiedene Prozessoreigenschaften festgelegt:
51
; PWRTE_ON schaltet den Power Up Timer ein, d.h. der Prozessor wartet nach
52
; dem Einschalten ca. 70ms mit dem Programmstart, um sicher zu sein,
53
; dass alle angeschlossene Peripherie bereit ist.
54
; CP_OFF schaltet die Code-Protection des Prozesors aus. Damit ist das im Prozessor
55
; befindliche Programm jederzeit auslesbar und überschreibbar.
56
; HS_OSC spezifiziert einen Quarzoszillator (Highspeed) als Zeitbasis für den Prozessor.
57
; WDT_OFF schaltet den Watchdog-Timer des Prozesors aus.
58
59
60
;*******************************************************************************
61
;*                         Register / Variablen  festlegen                     *
62
;*******************************************************************************
63
; hier werden Adressen von Registern / Variablen festgelegt. Diese werden beginnend
64
; mit der Adresse H'20' aufsteigend vergeben.
65
  CBLOCK  H'20'
66
           sensor   ; Variable wird benutzt um den ausgelesenen ByteCode vom Sensor geschrieben
67
    bcd_wert ; Variable in den der Umgewandelte Wert von Sensor geschrieben wird
68
    
69
    wait
70
           wait_1
71
           wait_2
72
    
73
        
74
  ENDC
75
;*******************************************************************************
76
;*                         Konstanten festlegen                                * 
77
;*******************************************************************************
78
79
; Hier sollten alle im Verlauf des Programms verwendeten Konstanten deklariert werden.
80
; Die Deklaration sieht z.B. folgendermaßen aus:
81
82
;*******************************************************************************
83
;*  Definition von einzelnen Bits in einem Register / in einer Variable        *
84
;*******************************************************************************
85
; hier kann mit Hilfe der #DEFINE Direktive einzelnen Bits in einem Register ein
86
; Name zugewiesen werden.
87
; Eine Definition sieht z.B. folgendermaßen aus:
88
;
89
;*******************************************************************************
90
;*       Name       *       Port       * Bedeutung / Funktion                  *
91
;*******************************************************************************
92
#DEFINE  Sensor            PORTA,0        ;Anschluss für 1-Wire Sensor
93
#DEFINE  TH                PORTA,1        ;Taster für höchste Temperatur -->TH =Temp High 
94
#DEFINE  TL                PORTA,2        ;Taster für niedrigste Temperatur -->TL =Temp Low 
95
;*******************************************************************************
96
#DEFINE  IA                PORTB,0        ;BCD Decoder Eingang IA  
97
#DEFINE  IB                PORTB,1        ;BCD Decoder Eingang IB 
98
#DEFINE  IC                PORTB,2        ;BCD Decoder Eingang IC 
99
#DEFINE  ID                PORTB,3        ;BCD Decoder Eingang ID
100
;*******************************************************************************
101
#DEFINE  T1                PORTB,7        ;Transistor T1 --> Für Anzeige 1
102
#DEFINE  T2                PORTB,6        ;Transistor T2 --> Für Anzeige 2
103
#DEFINE  T3                PORTB,5        ;Transistor T3 --> Für Anzeige 3  
104
#DEFINE  bank1    STATUS, RP0 ;Spezielle Register Bank
105
;*******************************************************************************
106
;*******************************************************************************
107
;*                                  Programmstart                              *
108
;*******************************************************************************
109
  ORG  H'00'    ; Das Programm wird ab Speicherstelle 0 in den Speicher geschrieben
110
  GOTO  init    ; Springe zur Grundinitialisierung der Ports A und B
111
;*******************************************************************************
112
;*                                  Initialisierung                            *
113
;*******************************************************************************
114
init  BSF  bank1    ; wechsle zu Registerbank 1 (spezielle Register)
115
  MOVLW  B'00011111'
116
  MOVWF  TRISA    ; RA0 .. RA4 Eingänge
117
  MOVLW  B'00000000'
118
  MOVWF  TRISB    ; RB0-RB7 Ausgänge
119
  BCF  bank1    ; wechsle zu Registerbank 0 (normaler Speicherbereich)
120
        
121
  CLRF  PORTA    ; Port A löschen
122
  CLRF  PORTB    ; Port B löschen
123
        
124
; Die Register TRISA und TRISB legen fest, welche Bits in den jeweiligen Ports Ein- bzw.
125
; Ausgänge sind. Eine '1' an der entsprechenden Stelle setzt das Bit des Ports als Ein-
126
; gang eine '0' setzt das Bit als Ausgang.
127
;*******************************************************************************
128
;*                                  Hauptprogramm                              *
129
;*******************************************************************************
130
main
131
         BSF T3         
132
         BSF IA
133
         
134
         
135
         
136
         
137
         
138
         
139
         
140
141
        
142
;*******************************************************************************
143
;*                                 Unterprogramme                              *
144
;*******************************************************************************
145
146
147
148
UP_wait1s
149
      ;4999993 cycles
150
  movlw  0x2C
151
  movwf  wait
152
  movlw  0xE7
153
  movwf  wait_1
154
  movlw  0x0B
155
  movwf  wait_2
156
UP_wait1s_0
157
  decfsz  wait, f
158
  goto  $+2
159
  decfsz  wait_1, f
160
  goto  $+2
161
  decfsz  wait_2, f
162
  goto  UP_wait1s_0
163
164
      ;3 cycles
165
  goto  $+1
166
  nop
167
168
      ;4 cycles (including call)
169
  return
170
         
171
END
so hier mal der Code
ich muss ja nur ein Bit setztn da die andern ja automatisch auf null 
sind oder?
falls nicht wie setzte ich es auch 0?
Datenblatt des BCD Decoders

http://www.ortodoxism.ro/datasheets2/c/0g2l9c1e4yo8otekcu2hwgj0hrcy.pdf

mfg
schally

von Severino R. (severino)


Lesenswert?

Die Ports sind nicht automatisch auf null, aber Du setzt sie ja selber 
auf null. Mir fällt nichts Seltsames auf, es müsste ja funktionieren.

Etwas allerdings: Du solltest am Schluss von Deinem main, vor dem 
Unterprogramm, einen Sprung auf sich selber oder auf main einfügen, da 
sonst das Programm durchläuft und wohl wieder von Anfang an startet, 
dabei die Ports wieder auf 0 setzt etc.

Kannst Di mit einem Oszi schauen, was RB0 ausgibt?

Severino

von Steffen P. (Gast)


Lesenswert?

Hi,
habe leider kein Oszi...
So ich werde nun nochmal dieses Board nochmal neu löten...

mfg
schally

von Severino R. (severino)


Lesenswert?

Du kannst Dein Programm auch im MPLAB SIM Simulator laufen lassen und 
dann in Watch-Fenster schauen, was RB0 ausgigt.
Wenn es hier stimmt, liegt das Problem wahrscheinlich an der Hardware.

Severino

von Steffen P. (Gast)


Lesenswert?

Ok werde mir dieses TOOL mal runterladen und schauen was es ausgibt!

mfg
schally

von Severino R. (severino)


Lesenswert?

MPLAB SIM ist in MPLAB integriert.
Ich nehme jetzt mal an, dass Du mit MPLAB arbeitest. Jedenfalls kennen 
ich für Assembler-Programmierung von PICs nichts Besseres.

Menü Debugger -> Select Tool -> MPLAB SIM

Severino

von Steffen P. (Gast)


Angehängte Dateien:

Lesenswert?

wie seh ich das was der macht?

mfg
schally

kannst du vvl nicht mal schauen?

von Severino R. (severino)


Angehängte Dateien:

Lesenswert?

Also, in MPLAB SIM werden die Bits korrekt gesetzt.

Beiliegend das fertige Projekt mit Watch-Fenster und gesetztem 
Breakpoint.

Du öffnest den Workspace (File->Open Workspace), drückst anschliessend 
F9 um das Programm zu starten, dann sieht Du, dass er an die erste 
Instruktion in main springt. Nun kannst Du mit F7 Schritt für Schritt 
durch Dein Programm gehen und im Watch-Fenster das PORTB beobachten, wie 
es sich verändert. Am besten in der Spalte "Binary".

Viel Spass

Severino

von Steffen P. (Gast)


Lesenswert?

ok dann muss es wohl an der Hardware liegen also später nochmal schauen 
ob ich was vergessen hab usw...

Thx erstmal meld mich nochmal

mfg
schally

von Steffen P. (Gast)


Lesenswert?

So mein Probwar das ich an den OC Ausgängen des ULN2803 gehangen habe 
und nicht direkt am PIC.

und wie schalte ich die Transistoren jetzt aus?
weil ich lade

MOVLW B'0001';Zahl 1 ins W-Register laden
MOVWF PORTB ;Gebe diese jetzt aus

ps:hier mal en vid
http://steffen-schalhorst.de/HBFI_05c/Abschlussprojekt/Video/Zaehler.AVI


mfg
schally

von Severino R. (severino)


Lesenswert?

Steffen S. wrote:
> So mein Probwar das ich an den OC Ausgängen des ULN2803 gehangen habe
> und nicht direkt am PIC.

Davon hast Du aber nichts erwähnt.

>
> und wie schalte ich die Transistoren jetzt aus?

welche jetzt: die einzelnen im Video oder die im ULN2803 ?
> weil ich lade
>
> MOVLW B'0001';Zahl 1 ins W-Register laden
> MOVWF PORTB ;Gebe diese jetzt aus

Versuch mal:
MOVLW B'0000' ; 1 = ein; 0 = aus (?!)
MOVWF PORTB

>
> ps:hier mal en vid
> http://steffen-schalhorst.de/HBFI_05c/Abschlussprojekt/Video/Zaehler.AVI

Toll, danke für den Feedback. Es funktioniert ja!

Severino

von Steffen P. (Gast)


Lesenswert?

Hi,
hier der Schaltplan

http://steffen-schalhorst.de/HBFI_05c/Abschlussprojekt/ATINF/Schaltplan/pic_thermo.pdf

Transistoren BC557C PNP.

Funzt auch net weil dann zeigt er mir die 000 an (wegen den 3 7Segment 
Anzeigen)

mfg
schally

von Peter D. (peda)


Lesenswert?

Mir stellt sich die Frage, warum man überhaupt so einen uralt 7447 
TTL-Chip an nen MC dranpappen sollte ?

So ein kleines bischen Tabellenzugriff von Ziffer auf 7-Segment-Code 
sollte doch sogar auch ein PIC schaffen.

Wenns nur ums Pin sparen geht, würde ich nen 74HC164 dranpappen (2 -> 8 
Pins).


Peter

von Severino R. (severino)


Lesenswert?

Steffen S. wrote:

> Funzt auch net weil dann zeigt er mir die 000 an (wegen den 3 7Segment
> Anzeigen)

Und was ist daran nicht gut?

Kannst Du bitten etwas klarer darstellen, was Du wie erreichen willst, 
und was stattdessen geschieht?

Im Übrigen hat Peter Dannegger schon recht, warum überhaupt den 7447?

Severino

von schally (Gast)


Lesenswert?

weil ich den in der schule behandelt habe...

mfg
schally

von Severino R. (severino)


Lesenswert?

@ schally

Steffen S. wrote:
[..]
> Mein Problem ist es das ich nicht weiss wie ich
> den SN74LS47N ansteuern wegen dem HIGH und LOW wenn ich nach der Tabelle
> aus dem Datenblatt gehe bekomme ich nichts gescheites dabei herraus!
>
> Kann mir bitte jemand von euch helfen?
>
> mfg
> schally

und jetzt

> weil ich den in der schule behandelt habe...

Du hast ihn in der Schule behandelt und weisst nicht, wie Du ihn 
ansteuern sollst???

Jedenfalls: Funktioniert nun Dein Projekt?

Severino

von Steffen P. (Gast)


Lesenswert?

Noch nicht ganz habe noch etliche Problme mit dem Ansteuern des 1-Wire 
Sensors DS18S20....
hat vvl jemand en guten Link dazu wo das mal ein bissjen erklärt wird?

mfg
schally

von Severino R. (severino)


Lesenswert?


von Steffen P. (Gast)


Lesenswert?

Severino R. wrote:
> hier vielleicht:
> http://elektronik.kai-uwe-schmidt.de/index.php?page=pic_thermometer
>
> oder hier mit C-Sourcecode:
> http://wiki.atrox.at/index.php/Simple_1wire_PIC_Program

hi
darauf bin ich auch schon gestossen aber ich bekomme es einfach nicht 
hin...

mfg
schally

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.