PIC 16F84A+SN7447 Wie ansteuern?

Gast #529191
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
Gast #529208
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
Gast #529225
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

Gast #529254
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 
*
;*********************************************************************** 
********
#529259
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
Gast #529266
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
#529359
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
#529418
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
Angehängte Dateien:
#530515
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
#531361
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
#536741
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

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