PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Hilfe: Programm übersetzen C -> BasCom [ Oszi Uhr ]



tc-maxx
02.02.2009, 20:18
Hallo,

ich möchte ein Programm von C nach Bascom übersetzen. Nun bekomme ich schon die ersten Schwierigkeiten.

1. Wie kann ich folgenden C-Code nach BasCom übersetzen?



#define HIGH PORTB = 0b11 // oberes Segment
#define MID PORTB = 0b10 // mittleres Segment
#define LOW PORTB = 0b01 // unteres Segment
#define ZERO PORTB = 0b00 // unterste Linie


Gibt es eine elegantere Lösung als z.B. eine Funktion zu erstellen und dann die entsprechende Option mitzugeben?


2. Was passiert hier?



unsigned char line[SLOTS] ;
...

if(line[dIdx].F6)
{
MID, LOW, MID, LOW ;
MID, LOW, MID, LOW ;
MID, LOW, MID, LOW ;
MID, LOW, MID, LOW ;
MID, LOW, MID, LOW ;
MID, LOW, MID, LOW ;
MID, LOW, MID, LOW ;
MID, LOW, MID, LOW ;

}


was bedeutet das '.F6' ?

Werden mit 'MID, LOW, MID, LOW ;' nacheinander die Porteingänge geschalten?


Danke
Gruß
MaXX

hardware.bas
04.02.2009, 12:23
Vielleicht kannst Du ja das Projekt kurz beschreiben, damit mans gleich
ins BASCOM schreibt, ohne sich mit C rumzuplagen? VG Micha

tc-maxx
04.02.2009, 14:25
Hallo, JA! Das ist vielleicht das Beste :)

Es handelt sich um eine Oszi-Clock die mit einen Kanal und einem Ext.Triggereingang zurecht kommt.

-> http://www.micro-examples.com/public/microex-navig/doc/082-pic-oscillo-clock

Dort läuft die Uhr allerdings auf einem Pic. Ich möchte die Uhr so in der Art. auf einem kleinen Attiny (12) & BasCom an's laufen bringen.

Mir ist im C-Code einiges an der Funktionsweise unklar.

Gruß
MaXX

hardware.bas
04.02.2009, 15:19
Klar! Passt auch besser mit Atmel-Chip. Ne genaure Erklärung wär
trotzdem nicht schlecht. Bin des Englischen nicht sehr mächtig.
VG Micha

PicNick
04.02.2009, 15:22
Da Line ja als char (byte) definiert ist, kann "F6" eigentlich nur ein Bit davon sein, vermutlich bit 6
d.h., wenn dieses bit in char [ idx ] gesetzt ist, durchläuft er
Portb= &H11
Portb= &H01.....
insgesamt 16 mal

mehr ist aus dem Code-Fragment nicht zu entnehmen.

Es spricht die Glaskugel:
vermutlich wird durch Portb die Spannung auf der Y-Achse geregelt,
also würde der Strahl schnell hin-und-herspringen, also zwei Punkte oder zwei waagrechte Linien am Oszi erzeugen, je nachdem, was sich auf der X.Achse tut

EDIT: Hab mir den Link angesehen, kenn mich aus. Ist wie vermutet, allerdings erzeugt der Code oben eine Vertikale linie (weil ja X-Achse weiterwandert, dadurch breiter und man sieht dir vertikale Ablenkung

tc-maxx
04.02.2009, 15:23
hier mal frei übersetzt:



Für vertikale Segmente die Spannung ein paar Mal hintereinander schnell hoch und runter regeln.
Für horizontale Segmente die Spannung verändern und so lange halten wie sie gebraucht wird.

Durch die Verwendung von zwei AVR - Ausgängen und ein R2R Digital / Analog-Wandler erhalten wir bis zu vier verschiedenen Spannungsebenen. Drei Ebenen für die vertikalen Segmente und eine Ebene für die NULL-Linie (Ebene wenn kein Segment gezeichnet wird.)

Das Problem ist, dass 7-Segment-Ziffern bis zu drei horizontale Linien zur gleichen Zeit beinhalten können (z.B. 2, 3, 8, 9 ..).
Wir können aber nur eine horizontale Linie in einer Periode zeichnen. Wir benötigen also drei Perioden um eine 7-Segment Ziffer zu zeichnen.

Durch die Trägheit des Auges ist es möglich eine vollständige 7-Segment-Ziffer.darzustellen.

Angenommen, wir wollen um 12:34:56 auf dem Bildschirm: darstellen: …



VG MaXX

PicNick
04.02.2009, 15:33
In der line [slots] sind die 7-Segmente als Bit gesetzt. diese Bits (z.B F6)
fragt er ab und macht die entsprechenden Sprünge auf dem Oszi.

tc-maxx
04.02.2009, 15:35
Da Line ja als char (byte) definiert ist, kann "F6" eigentlich nur ein Bit davon sein, vermutlich bit 6
d.h., wenn dieses bit in char [ idx ] gesetzt ist, durchläuft er
Portb= &H11
Portb= &H01.....
insgesamt 16 mal

mehr ist aus dem Code-Fragment nicht zu entnehmen.

Es spricht die Glaskugel:
vermutlich wird durch Portb die Spannung auf der Y-Achse geregelt,
also würde der Strahl schnell hin-und-herspringen, also zwei Punkte oder zwei waagrechte Linien am Oszi erzeugen, je nachdem, was sich auf der X.Achse tut

Danke, jetzt wird es schon etwas klarer.
Mir ist auch noch unklar wo/wie die einzelnen Segmente definiert werden



/*
************************************************** *****************************
* PICOCLOCK : PIC Oscilloscope CLOCK
************************************************** *****************************
*
* This program shows how to display a digital clock on an oscilloscope
* with a PIC and only 4 resistors.
*
* Circuit schematics :
*
* ------------+
* RA0 +----------------> to oscilloscope X trigger input
* |
* RA1 +----------------> pull-up, button to ground : minutes adjustment
* RA2 +----------------> pull-up, button to ground : hours adjustment
* PIC | ____
* RB1 +----|____|-----+---------> to oscilloscope Y input
* | 680 |
* | +-+
* | | | 330
* | +-+
* | ____ |
* RB0 +----|____|-----+
* | 680 |
* ------------+ +-+
* | | 680
* +-+
* |
* -----
* --- GND
* -
*
* Oscilloscope setup :
* set timebase to 0.1 ms, V/div = 1 V
* select external trigger.
*
* source code for mikro C compiler V7.0.0.3
* feel free to use this code at your own risks
* and don't bother me if you get addicted watching this clock.
*
* target : PIC16 or PIC18, 16 Mhz crystal
* HS clock, no watchdog.
*
* tested with PIC16F84A and PIC16F877A
*
* Author : Bruno Gavand, October 2007
* see more details on http://www.micro-examples.com/
*
************************************************** *****************************
*/
#define TRIGGER PORTA.F0 // this output is to be connected to oscilloscope trigger input
#define KEY PORTA & 0b110 // input keys mask
#define KEY_MIN_UP PORTA & 0b010 // minute adjust button
#define KEY_HH_UP PORTA & 0b100 // hour adjust button

/*
* 2 bits R2R DAC gives 4 output levels :
*/
#define HIGH PORTB = 0b11 // uper line
#define MID PORTB = 0b10 // middle line
#define LOW PORTB = 0b01 // lower line
#define ZERO PORTB = 0b00 // lowest line

#define MAX_SCALER 15625 // number of timer 0 overflow per second @ 16 Mhz = 16000000 / 4 / 256

#define MAX_DIGIT 6 // number of digits to be displayed
#define SLOTS (MAX_DIGIT * 3 + 4) // number of time slots : 2 for header, 3 per digits, 2 for trailer

/*
* 10 digits 7 segment encoding + blank
*/
const unsigned char septSeg[11] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x00 } ;

/*
* slot index for digit start
*/
const unsigned char sIdx[] = {1, 4, 8, 11, 15, 18} ;

unsigned char display[MAX_DIGIT] ; // digit to be displayed

/*
* time slot encoded line flags :
* bit 0 is upper line
* bit 1 is middle line
* bit 2 is lower line
* (if no line flag is set, spot is redirected to lowest line)
* bit 6 is lower vertical bar
* bit 7 is upper vertical bar
*/
unsigned char line[SLOTS] ;

unsigned char dIdx = 0 ; // time slot counter
unsigned char fIdx = 0 ; // frame counter

unsigned int scaler = 0 ; // RTC scaler
unsigned char ss = 0, mn = 0, hh = 0 ; // RTC

/*
* around 10 micro-second delay
*/
void delay10us()
{
Delay_us(10) ;
}

/*
* ISR
*/
void interrupt(void)
{
if(INTCON.T0IF) // if timer 0 overflow
{
scaler++ ; // increment scaler
if(scaler > MAX_SCALER) // one second has expired ?
{
scaler = 0 ; // clear scaler
ss++ ; // next second
if(ss == 60) // last second in minute ?
{
ss = 0 ; // clear second
mn++ ; // next minute
if(mn == 60) // last minute in hour ?
{
mn = 0 ; // clear minute
hh++ ; // next hour
if(hh == 24) // last hour in day ?
{
hh = 0 ; // clear hour
}
}
}
}

if(line[dIdx].F6 && line[dIdx].F7) // if full vertical bar
{
LOW, HIGH, LOW, HIGH ;
LOW, HIGH, LOW, HIGH ;
LOW, HIGH, LOW, HIGH ;
LOW, HIGH, LOW, HIGH ;
LOW, HIGH, LOW, HIGH ;
LOW, HIGH, LOW, HIGH ;
LOW, HIGH, LOW, HIGH ;
LOW, HIGH, LOW, HIGH ;
}
else if(line[dIdx].F6) // if lower vertical bar
{
MID, LOW, MID, LOW ;
MID, LOW, MID, LOW ;
MID, LOW, MID, LOW ;
MID, LOW, MID, LOW ;
MID, LOW, MID, LOW ;
MID, LOW, MID, LOW ;
MID, LOW, MID, LOW ;
MID, LOW, MID, LOW ;
}
else if(line[dIdx].F7) // if upper vertical bar
{
MID, HIGH, MID, HIGH ;
MID, HIGH, MID, HIGH ;
MID, HIGH, MID, HIGH ;
MID, HIGH, MID, HIGH ;
MID, HIGH, MID, HIGH ;
MID, HIGH, MID, HIGH ;
MID, HIGH, MID, HIGH ;
MID, HIGH, MID, HIGH ;
}

if(dIdx == 7) // hour : minute separator
{
LOW, Delay10us() ;
MID, Delay10us() ;
}
else if(dIdx == 14) // minute : second separator
{
if(scaler < MAX_SCALER / 2) // blink 0.5 Hz
{
LOW, Delay10us() ;
MID, Delay10us() ;
}
}

switch(fIdx) // depending on frame index
{
case 0: // upper line
if(line[dIdx] & 1)
{
HIGH ;
}
else
{
ZERO ;
}
break ;
case 1: // middle line
if(line[dIdx] & 2)
{
MID ;
}
else
{
ZERO ;
}
break ;
case 2: // lower line
if(line[dIdx] & 4)
{
LOW ;
}
else
{
ZERO ;
}
break ;
}

dIdx++ ; // next slot
if(dIdx == SLOTS) // last slot ?
{
dIdx = 0 ; // clear slot

TRIGGER = 1 ; // triggers the scope
fIdx++ ; // next frame
if(fIdx == 3) // last frame ?
{
fIdx = 0 ; // clear frame
}
TRIGGER = 0 ; // end trigger
}
INTCON.T0IF = 0 ; // clear timer 0 overflow
}
}

/*
* main entry
*/
void main()
{
#ifdef P16F877A
/*
* set PORTA as digital I/O
*/
ADCON1 = 7 ;
CMCON = 7 ;
#endif

TRISA = 0b110 ; // PORTA direction register
PORTA = 0 ;

TRISB = 0 ; // PORTB is output
PORTB = 0 ;

/*
* clear buffers
*/
memset(&line, 0, sizeof(line)) ;
memset(display, 0, sizeof(display)) ;

OPTION_REG = 0b11011000 ; // timer 0 prescaler is 1:1
INTCON = 0b10100000 ; // start interrupts

for(;;) // main loop
{
unsigned char i ;

if(KEY) // is a button pressed ?
{
if(KEY_MIN_UP) // adjust minutes
{
ss = 0 ;
mn++ ;
}
else if(KEY_HH_UP) // adjust hours
{
ss = 0 ;
hh++ ;
}
mn %= 60 ; // prevent minute overflow
hh %= 24 ; // prevent hours overflow
Delay_ms(100) ; // debounce
}

/*
* prepare display buffer
*/
display[5] = ss % 10 ; // seconds
display[4] = ss / 10 ;

display[3] = mn % 10 ; // minutes
display[2] = mn / 10 ;

display[1] = hh % 10 ; // hours
display[0] = (hh > 9) ? hh / 10 : 10 ; // blank first digit if zero

/*
* prepare time slot flags
*/
for(i = 0 ; i < MAX_DIGIT ; i++) // for each digit
{
unsigned char s ;
unsigned char *p ;

s = septSeg[display[i]] ; // get 7 segment encoding

p = &line[sIdx[i]] ; // get pointer to time slot, left part of the digit

(*p).F0 = s.F0 ; // a segment
(*p).F1 = s.F6 ; // g segment
(*p).F2 = s.F3 ; // d segment

(*p).F6 = s.F4 ; // e segment
(*p).F7 = s.F5 ; // f segment

p++ ; // next slot, center part of the digit

(*p).F0 = s.F0 ; // a segment (continuation)
(*p).F1 = s.F6 ; // g segment (continuation)
(*p).F2 = s.F3 ; // d segment (continuation)

p++ ; // next slot, right part of the digit

(*p).F6 = s.F2 ; // b segment
(*p).F7 = s.F1 ; // c segment
}
}
}


Könnte das in dieser Zeile sein?



const unsigned char septSeg[11] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x00 } ;


ich habe das mal umgewandelt aber ich sehe da noch nichts.


DEC: 063 |006 |091 |079, |102 |109 |125 |007 |127 |111 |000
BIN: 111111,0000110,1011011,1001111,1100110,1101101,111 1101,0000111,1111111,1101111,0000000

die 0x3f könnte ja die '0' sein ...und die 0x06 die '1'

0111111
gfedcba = '0'

0000110 = '1'
gfedcba

...
http://upload.wikimedia.org/wikipedia/commons/thumb/0/02/7_segment_display_labeled.svg/300px-7_segment_display_labeled.svg.png

PicNick
04.02.2009, 15:45
Bingo, das ist sie wohl :oops: steht sogar drüber
3F ist wohl der 0-er , 06 der 1-er, 7F wird der 8-er sein.
denke, die Tabelle geht von 0-9

Edit + 1 mal 00 für blank

SprinterSB
04.02.2009, 15:55
Wenn das wirklich die Deklaration von line[] ist, dann ist das .F6 kein Standard-C sondern irgend ein Sonderlocken-C.

Die Uhr ist ja recht simpel, was man so im Video sieht. Das sollte besser dierekt to codieren sein (in welcher Sprache auch immer) anstatt sich durch seltsamen oder undokumentierten Code durchzubeissen.

Bin momentan auch an ner Scope-Clock für nen AVR ATmega168 8)
Allerdings muss man do schon recht flott sein und braucht was fixeres als BASCOM:

http://www.youtube.com/watch?v=MFrI-8tLz-E
http://gjlay.de/pub/morpheus/index.html

tc-maxx
10.02.2009, 21:54
@SprinterSB: Sehr schönes interesantes Projekt - Da bin ich ja mal gespannt wenn du es richtig fertig hast !!


@

Was versteht man in C unter:



if (line[dIdx] & 1)

das '&' bedeutet doch eine bitweise Und-Verknüpfung.
aber was prüft dieser Ausdruck? Und wie würde man das in BasCom umsetzen?

Danke
Gruß MaXX

PicNick
11.02.2009, 08:16
IF Line( didx ).0 = 1 THEN

tc-maxx
11.02.2009, 10:09
Danke,

und

if (line[dIdx] & 2)
...
if (line[dIdx] & 4)
...
übersetze ich dann mit:

IF Line( didx ).0 = 2 THEN
...
IF Line( didx ).0 = 4 THEN
...
???

PicNick
11.02.2009, 11:11
haaaaaaalt:


1 => b00000001 => BitNr 0
2 => b00000010 => BitNr 1
4 => b00000100 => BitNr 2
8 => b00001000 => BitNr 3
16 => b00010000 => BitNr 4
32 => b00100000 => BitNr 5
64 => b01000000 => BitNr 6
128 => b10000000 => BitNr 7

Also->
If (line [idx] & 1 ) => IF Line ( idx ).0 = 1 THEN
If (line [idx] & 2 ) => IF Line ( idx ).1 = 1 THEN
If (line [idx] & 4 ) => IF Line ( idx ).2 = 1 THEN
If (line [idx] & 8 ) => IF Line ( idx ).3 = 1 THEN
If (line [idx] & 16 ) => IF Line ( idx ).4 = 1 THEN
If (line [idx] & 32 ) => IF Line ( idx ).5 = 1 THEN
If (line [idx] & 64 ) => IF Line ( idx ).6 = 1 THEN
If (line [idx] & 128 ) => IF Line ( idx ).7 = 1 THEN



Wenn du dich jetzt auskennst, bist du eh gut drauf :-)

tc-maxx
11.02.2009, 14:47
Der Hammer :)

Ich DANKE Dir!

Gruß MaXX

tc-maxx
11.02.2009, 16:47
display[0] = (hh > 9) ? hh / 10 : 10;
was mache ich hier in BasCom? ...C ist wirklich sehr abstrakt!

sast
11.02.2009, 16:57
Das ist eine if Abfrage

if (hh>9) display[0] = hh/10;
else display[0] = 10;


wie du das in Bascom machst hab ich keine Ahnung
sast

tc-maxx
11.02.2009, 19:32
Das ist eine if Abfrage

if (hh>9) display[0] = hh/10;
else display[0] = 10;


wie du das in Bascom machst hab ich keine Ahnung
sast

Dankeschön!

tc-maxx
11.02.2009, 22:01
So, hier die letzten Fragmente, was passiert hier & wie könnte es in BasCom umgesetzt werden ?



display[5] = ss % 10 ;


mn %= 60 ;


‘ Clear buffers
memset(&line, 0, sizeof(line)) ;
memset(display, 0, sizeof(display)) ;

Danke
Gruß MaXX

sast
12.02.2009, 07:09
eigentlich ist das Programm recht gut kommentiert.

ss%10 bedeutet, dass ss ganzzahlig durch 10 geteilt wird und der eventuell vorhandene Rest in display[5] geschrieben wird. Ich glaube das heißt modulo.

das selbe ist bei mn%=60;
dafür kannst du auch mn=mn%60; schreiben

memset schreibt wie es ja auch drüber steht in alle Bytes von line bzw display eine "0", um den Speicher zu säubern.

das ist schon alles

sast

tc-maxx
12.02.2009, 21:50
..hab dank, jetzt komme ich erstmal weiter.

LG MaXX

tc-maxx
17.02.2009, 20:15
...ich habe den C.Code mal umgesetzt und habe das ganze an mein Oszi angeschlossen. (ein Pin direkt an den ext. Triggger und den anderen über den 2Bit-R2R an den 1. Kanal)

EDIT:
Aktualisierter Code-> Ich habe die Sub 'Zustand' entfernt und verwende jetzt einen 16Mhz Quarz.



'------------[Meta]-------------------------------------------------------------
$regfile = "m32def.dat"
$crystal = 16000000
$hwstack = 32
$swstack = 10
$framesize = 40

'------------[Lib für KS108-gLCD]-----------------------------------------------
$lib "glcdKS108.lbx"

'------------[GLCD Config]------------------------------------------------------
Config Graphlcd = 128 * 64sed , Dataport = Portc , Controlport = Porta , Ce = 1 , Ce2 = 2 , Cd = 3 , Rd = 4 , Reset = 0 , Enable = 5
Cls
Setfont Font6x8 ' Forn laden


'------------[Const & Variabeln definieren]-------------------------------------
Const Max_digit = 6 ' Sechs Zeichen müssen dargestellt werden
Const Slots = Max_digit * 3 + 4 ' Anzahl der Zeitschlitze -> 2 für Header, 3 pro Zeichen, 2 für Trailer

Dim Ss As Byte ' Sekunde
Dim Mn As Byte ' Minute
Dim Hh As Byte ' Stunde

Dim Line_(slots) As Byte
Dim Didx As Byte ' Zeitschlitz (timeslot) counter
Dim Fidx As Byte ' Frame counter

Dim I As Byte

Dim Display_(max_digit) As Byte ' anzeigbare Zeichen

Dim S As Byte
Dim P As Byte

Dim Tmp As Byte ' temp

'------------[Ports definieren]-------------------------------------------------
'------------[AVR-Atmega32-Pins]--------------------------------------------
'PortA.0 = | PortB.0 = | PortC.0 = | PortD.0 =
'PortA.1 = | PortB.1 = | PortC.1 = | PortD.1 =
'PortA.2 = | PortB.2 = | PortC.2 = | PortD.2 = DCF-77
'PortA.3 = | PortB.3 = | PortC.3 = | PortD.3 = Status-LED
'PortA.4 = | PortB.4 = | PortC.4 = | PortD.4 = R2R-Bit.2
'PortA.5 = | PortB.5 = | PortC.5 = | PortD.5 = R2R-Bit.1
'PortA.6 = | PortB.6 = | PortC.6 = | PortD.6 = Trigger
'PortA.7 = | PortB.7 = | | PortD.7 =
'-------------------------------------------------------------------------------

'----[Trigger-Output]-----------------------------------------------------------
Config Pind.6 = Output
Trigger Alias Portd.6

'----[2Bit R2R DAU]-------------------------------------------------------------
Config Pind.5 = Output
Bit1 Alias Portd.5
'----[2Bit R2R DAU]-------------------------------------------------------------
Config Pind.4 = Output
Bit2 Alias Portd.4

'----[Status-LED]---------------------------------------------------------------
Config Pind.3 = Output
Led Alias Portd.3
Led = 1 ' LED einschalten

'----[Taster_Stunde]------------------------------------------------------------
Config Pinb.0 = Input
Taster_hr Alias Pinb.0
Portb.0 = 1 ' Pullup aktivieren
'----[Taster_Minute]------------------------------------------------------------
Config Pinb.1 = Input
Taster_mn Alias Pinb.1
Portb.1 = 1 ' Pullup aktivieren

'----[DCF_77-Input]-------------------------------------------------------------
Config Pinb.2 = Input
Dcf_77 Alias Pinb.2
Portb.2 = 0 ' Pullup deaktivieren

'------------[Timer1 konfigurieren]---------------------------------------------
Config Timer1 = Timer , Prescale = 256
On Timer1 Ontimer
Const Pre = 43200
Load Timer1 , Pre


'------------[Interrupts aktivieren]--------------------------------------------
Enable Interrupts ' Interrupts aktivieren

'------------[Programm]---------------------------------------------------------
'------------[Start]------------------------------------------------------------
Cls

' ------[TEST]------------------------------------------------------------------
' Zustand 90 : Lcdat 1 , 0 , "Zero " : Wait 1 ' Zero
' Zustand 76 : Lcdat 1 , 0 , "Lower " : Wait 1 ' Lower
' Zustand 77 : Lcdat 1 , 0 , "Middle" : Wait 1 ' Middle
' Zustand 72 : Lcdat 1 , 0 , "High " : Wait 1 ' High
' Lcdat 1 , 0 , "run.."


Enable Timer1

Do
' Lcdat 1 , 0 , Hh , ":" , Mn . ":" , Ss
' ----------[Buffer leeren]-----------------------------------------------------
For I = 1 To Slots : Line_(i) = 0 : Next
For I = 1 To Max_digit : Display_(i) = 0 : Next

' ----------[Prepare display buffer]--------------------------------------------
Display_(6) = Ss Mod 10 ' Sekunden
Display_(5) = Ss / 10

Display_(4) = Mn Mod 10 ' Minuten
Display_(3) = Mn / 10

Display_(2) = Hh Mod 10 ' Stunden
If Hh > 9 Then Display_(1) = Hh / 10 Else Display_(1) = 10 ' blank first, digit if Zero

' ----------[Tasterabfrage zum einstellen der Uhrzeit]--------------------------
Debounce Taster_mn , 0 , Incr_mn , Sub ' Minuten einstellen
Debounce Taster_hr , 0 , Incr_hr , Sub ' Stunden einstellen

Mn = Mn Mod 60 ' prevent minute overflow
Hh = Hh Mod 24 ' prevent hours overflow

' ----------[Prepare time slot flags]-------------------------------------------

For I = 1 To Max_digit ' Für jedes Zeichen

S = Lookup(display_(i) , Septseg) ' Get 7 segment encoding

Tmp = Lookup(i , Sidx) ' get pointer to time slot, left part of the digit
P = Line_(tmp)

'================================================= ======================

P.0 = S.0 ' Bit.0 | Segment A
P.1 = S.6 ' Bit.6 | Segment G
P.2 = S.3 ' Bit.3 | Segment D

P.6 = S.4 ' Bit.4 | Segment E
P.7 = S.5 ' Bit.5 | Segment F

'================================================= ======================

Incr P ' Next slot ,center part of the digit

'================================================= ======================

P.0 = S.0 ' Bit.0 | Segment A (fortsetzung)
P.1 = S.6 ' Bit.6 | Segment G (fortsetzung)
P.2 = S.3 ' Bit.3 | Segment D (fortsetzung)

Incr P ' Next slot, right part of the digit

P.6 = S.2 ' Bit.6 | Segment B
P.7 = S.1 ' Bit.1 | Segment C
'================================================= ======================

Next I

' ------[Teil des ISR Interruptsprung aus dem C-Code]---------------------------

'----------------------------------------------------------------------
If Line_(didx).6 = 1 And Line_(didx).7 = 1 Then ' if full vertical bar
Bit1 = 0 : Bit2 = 1 : Bit1 = 1 : Bit2 = 1 : Bit1 = 0 : Bit2 = 1 : Bit1 = 1 : Bit2 = 1 'Low,High,Low,High -> 16 mal durchlaufen damit die Seitenleiste breiter wird…
Bit1 = 0 : Bit2 = 1 : Bit1 = 1 : Bit2 = 1 : Bit1 = 0 : Bit2 = 1 : Bit1 = 1 : Bit2 = 1
Bit1 = 0 : Bit2 = 1 : Bit1 = 1 : Bit2 = 1 : Bit1 = 0 : Bit2 = 1 : Bit1 = 1 : Bit2 = 1
Bit1 = 0 : Bit2 = 1 : Bit1 = 1 : Bit2 = 1 : Bit1 = 0 : Bit2 = 1 : Bit1 = 1 : Bit2 = 1
Bit1 = 0 : Bit2 = 1 : Bit1 = 1 : Bit2 = 1 : Bit1 = 0 : Bit2 = 1 : Bit1 = 1 : Bit2 = 1
Bit1 = 0 : Bit2 = 1 : Bit1 = 1 : Bit2 = 1 : Bit1 = 0 : Bit2 = 1 : Bit1 = 1 : Bit2 = 1
Bit1 = 0 : Bit2 = 1 : Bit1 = 1 : Bit2 = 1 : Bit1 = 0 : Bit2 = 1 : Bit1 = 1 : Bit2 = 1
Bit1 = 0 : Bit2 = 1 : Bit1 = 1 : Bit2 = 1 : Bit1 = 0 : Bit2 = 1 : Bit1 = 1 : Bit2 = 1
Elseif Line_(didx).6 = 1 Then ' if lower vertical bar
Bit1 = 1 : Bit2 = 0 : Bit1 = 0 : Bit2 = 1 : Bit1 = 1 : Bit2 = 0 : Bit1 = 0 : Bit2 = 1 'Mid,Low,Mid,Low -> 16 mal durchlaufen damit die Seitenleiste breiter wird…
Bit1 = 1 : Bit2 = 0 : Bit1 = 0 : Bit2 = 1 : Bit1 = 1 : Bit2 = 0 : Bit1 = 0 : Bit2 = 1
Bit1 = 1 : Bit2 = 0 : Bit1 = 0 : Bit2 = 1 : Bit1 = 1 : Bit2 = 0 : Bit1 = 0 : Bit2 = 1
Bit1 = 1 : Bit2 = 0 : Bit1 = 0 : Bit2 = 1 : Bit1 = 1 : Bit2 = 0 : Bit1 = 0 : Bit2 = 1
Bit1 = 1 : Bit2 = 0 : Bit1 = 0 : Bit2 = 1 : Bit1 = 1 : Bit2 = 0 : Bit1 = 0 : Bit2 = 1
Bit1 = 1 : Bit2 = 0 : Bit1 = 0 : Bit2 = 1 : Bit1 = 1 : Bit2 = 0 : Bit1 = 0 : Bit2 = 1
Bit1 = 1 : Bit2 = 0 : Bit1 = 0 : Bit2 = 1 : Bit1 = 1 : Bit2 = 0 : Bit1 = 0 : Bit2 = 1
Bit1 = 1 : Bit2 = 0 : Bit1 = 0 : Bit2 = 1 : Bit1 = 1 : Bit2 = 0 : Bit1 = 0 : Bit2 = 1
Elseif Line_(didx).7 = 1 Then ' if upper vertical bar
Bit1 = 1 : Bit2 = 0 : Bit1 = 1 : Bit2 = 1 : Bit1 = 1 : Bit2 = 0 : Bit1 = 1 : Bit2 = 1
Bit1 = 1 : Bit2 = 0 : Bit1 = 1 : Bit2 = 1 : Bit1 = 1 : Bit2 = 0 : Bit1 = 1 : Bit2 = 1
Bit1 = 1 : Bit2 = 0 : Bit1 = 1 : Bit2 = 1 : Bit1 = 1 : Bit2 = 0 : Bit1 = 1 : Bit2 = 1
Bit1 = 1 : Bit2 = 0 : Bit1 = 1 : Bit2 = 1 : Bit1 = 1 : Bit2 = 0 : Bit1 = 1 : Bit2 = 1
Bit1 = 1 : Bit2 = 0 : Bit1 = 1 : Bit2 = 1 : Bit1 = 1 : Bit2 = 0 : Bit1 = 1 : Bit2 = 1
Bit1 = 1 : Bit2 = 0 : Bit1 = 1 : Bit2 = 1 : Bit1 = 1 : Bit2 = 0 : Bit1 = 1 : Bit2 = 1
Bit1 = 1 : Bit2 = 0 : Bit1 = 1 : Bit2 = 1 : Bit1 = 1 : Bit2 = 0 : Bit1 = 1 : Bit2 = 1
Bit1 = 1 : Bit2 = 0 : Bit1 = 1 : Bit2 = 1 : Bit1 = 1 : Bit2 = 0 : Bit1 = 1 : Bit2 = 1
End If

If Didx = 7 Then ' Stunden : Minuten separator
Bit1 = 0 : Bit2 = 1 : Waitus 10 ' Low
Bit1 = 1 : Bit2 = 0 : Waitus 10 ' Mid
Elseif Didx = 14 Then ' Minuten : Sekunden separator
If Timer1 < 22336 Then ' Blink ~0.5 Hz -> (65536- const pre)
Bit1 = 0 : Bit2 = 1 : Waitus 10 ' Low
Bit1 = 1 : Bit2 = 0 : Waitus 10 ' Mid
End If
End If

Select Case Fidx ' Je nach Frameindex
Case 0 : If Line_(didx).0 = 1 Then ' obere Linie
Bit1 = 1 : Bit2 = 1 ' High
Else
Bit1 = 0 : Bit2 = 0 ' Zero
End If
Case 1 : If Line_(didx).1 = 1 Then ' mittlere Linie
Bit1 = 1 : Bit2 = 0 ' Mid
Else
Bit1 = 0 : Bit2 = 0 ' Zero
End If
Case 2 : If Line_(didx).2 = 1 Then ' untere Linie
Bit1 = 0 : Bit2 = 1 ' Low
Else
Bit1 = 0 : Bit2 = 0 ' Zero
End If
End Select

Incr Didx ' nächster Slot
If Didx = Slots Then ' letzter Slot ?
Didx = 0 ' lösche Slot
Trigger = 1 ' Oszi triggern (EIN)
Incr Fidx ' nächster Frame
If Fidx = 3 Then ' letzter Frame ?
Fidx = 0 ' lösche Frame
Trigger = 0 ' Oszi triggern (AUS)
End If
End If
' ---------------------------------------------------------------------
Loop


'======[Adjust-Time Labels]================================================== ===
Incr_mn:
Ss = 0
Incr Mn
Return

Incr_hr:
Ss = 0
Incr Hh
Return



'------------[Timer Interrupt Sprungmarke]--------------------------------------
Ontimer:
'----------------------------------------------------------------------
Toggle Led

Incr Ss ' nächste Sekunde
If Ss = 60 Then ' letzte Sekunde in der Minute ?
Ss = 0 ' lösche Sekunde
Incr Mn ' nächste Minute

If Mn = 60 Then ' letzte Minute in der Stunde ?
Mn = 0 ' lösche Minute
Incr Hh ' nächste Stunde

If Hh = 24 Then ' letzte Stunde am Tag?
Hh = 0 ' lösche Stunde
End If
End If
End If

'----------------------------------------------------------------------
Load Timer1 , Pre
Return


'---------[Ende]----------------------------------------------------------------
End


'----[Segment defenitionen]-----------------------------------------------------
Septseg:
Data &H3F , &H06 , &H5B , &H4F , &H66 , &H6D , &H7D , &H07 , &H7F , &H6F , &H00
' 0 1 2 3 4 5 6 7 8 9 -
'BiN: 0111111,0000110,1011011,1001111,1100110,1101101,11 11101,0000111,1111111,1101111,0000000
' gfedcba,gfedcba,gfedcba,gfedcba,gfedcba,gfedcba,gf edcba,gfedcba,gfedcba,gfedcba,gfedcba

'----[Slot Index für Zeichen-Start]---------------------------------------------
Sidx:
Data 1 , 4 , 8 , 11 , 15 , 18

$include "font6x8.font" ' Fontdatei einfügen

Ich bekomme bis jetzt nur zwei Punkte (einen auf Low und der andere auf Middle) und die Nullinie angezeig.

Den Part

if(line[dIdx].F6 && line[dIdx].F7) // if full vertical bar
{
LOW, HIGH, LOW, HIGH ; 16 mal durchlaufen damit die Seitenleiste breiter wird.
LOW, HIGH, LOW, HIGH ;
LOW, HIGH, LOW, HIGH ;
LOW, HIGH, LOW, HIGH ;
LOW, HIGH, LOW, HIGH ;
LOW, HIGH, LOW, HIGH ;
LOW, HIGH, LOW, HIGH ;
LOW, HIGH, LOW, HIGH ; }

else if(line[dIdx].F6) // if lower vertical bar
{
MID, LOW, MID, LOW ;
MID, LOW, MID, LOW ;
MID, LOW, MID, LOW ;
MID, LOW, MID, LOW ;
MID, LOW, MID, LOW ;
MID, LOW, MID, LOW ;
MID, LOW, MID, LOW ;
MID, LOW, MID, LOW ; }

else if(line[dIdx].F7) // if upper vertical bar
{
MID, HIGH, MID, HIGH ;
MID, HIGH, MID, HIGH ;
MID, HIGH, MID, HIGH ;
MID, HIGH, MID, HIGH ;
MID, HIGH, MID, HIGH ;
MID, HIGH, MID, HIGH ;
MID, HIGH, MID, HIGH ;
MID, HIGH, MID, HIGH ; }

if(dIdx == 7) // hour : minute separator
{ LOW, Delay10us() ;
MID, Delay10us() ; }
else if(dIdx == 14) // minute : second separator
{
if(scaler < MAX_SCALER / 2) // blink 0.5 Hz
{ LOW, Delay10us() ;
MID, Delay10us() ; }
}

switch(fIdx) // depending on frame index
{ case 0: // upper line
if(line[dIdx] & 1)
( HIGH ; )
else
( ZERO ; )
break ;

case 1: // middle line
if(line[dIdx] & 2)
( MID ; )
else
{ ZERO ; )
break ;

case 2: // lower line
if(line[dIdx] & 4)
{ LOW ; }
else
{ ZERO ; }
break ;
}


dIdx++ ; // next slot
if (dIdx == SLOTS) // last slot ?
{ dIdx = 0 ; // clear slot
TRIGGER = 1 ; // triggers the scope
fIdx++ ; // next frame
if(fIdx == 3) // last frame ?
{ fIdx = 0 ; ) // clear frame
TRIGGER = 0 ; ) // end trigger


aus dem C.Code habe ich mit in die Hauptschleife einbezogen. Hier könnte der Fehler liegen.

Kann sich das mal jemand anschauen?

DANKE!

Gruß MaXX

tc-maxx
19.02.2009, 18:18
EDIT: der obrige Beitrag wurde noch mal editiert...

Ich glaube das Problem liegt an der Timereinstellung.

In meinem Bascom.Code ist der Timer so konfiguriert, daß er jede Sekunde überläuft.

Im C.Code ist das etwas anders gelöst.. Wie kann ich das in Bascom umsetzen??
(dann könnte auch der letzte Part aus dem C.Code wieder in den ISR Interruptsprung)

Ich danke euch
Gruß MaXX