Forum: Mikrocontroller und Digitale Elektronik Array Byte für Byte auslsen und direkt an PORTB schreiben


von XORAND (Gast)


Lesenswert?

Hallo,

ich starte hier einfach nochmals ein neues Thema, da ich so einen 
besseren Betreff nehmen kann...

Frage habe ich auch am Ende des folgenden Themas schon gepostet... sorry 
!

Beitrag "Re: Port Manipulation aus Array, mit auslassen eines Bit"

Nichts desto trotz, hänge ich hier noch immer im Code fest...
Anbei habe ich meinen aktuellen Code einmal angehangen.

Was ich erreichen möchte:
Es soll das Array "segments" byte für byte ausgelesen und direkt an 
PORTB
geschrieben werden.

Dazu habe ich 2 For-Loops, der eine soll dafür sorgen, das Variable
"ip", immer von 0 bis max 3200 läuft, um dementsprechend im 2ten Loop
den PORTB zu schreiben und auch hier "ip" hochzuzählen. der zweite Loop
sorgt dafür, das immer Päckchen von 22 übergeben werden, bevor ein
kurzer delay kommt.

Frage: ist das so zulässig und "richtig" ? Da mein "erwartetes" Ergebnis
an der Hardware anders aussehen würde... oder beißt sich da die "ip"
oder das Array ?...

würde mich in jedem Fall über ein Feedback von euch freuen... ;)

Danke schon vorab !

1
 #ifndef F_CPU
2
#define F_CPU 16000000UL // 16 MHz clock speed
3
#endif
4
5
#include <avr/io.h>
6
#include <util/delay.h>
7
8
#define Latch_Clk_Pin     5
9
#define Shift_Clk_Pin     1
10
11
12
void shift_in(void);  // function toggles the Shift Clock
13
void latch_in(void);  // function toggles the Latch Clock
14
15
16
#define delay(a)          _delay_ms(a)
17
18
typedef struct
19
{
20
  unsigned int bit0:1;
21
  unsigned int bit1:1;
22
  unsigned int bit2:1;
23
  unsigned int bit3:1;
24
  unsigned int bit4:1;
25
  unsigned int bit5:1;
26
  unsigned int bit6:1;
27
  unsigned int bit7:1;
28
} _io_reg;
29
30
#define REGISTER_BIT(rg,bt) ((volatile _io_reg*)&rg)->bit##bt
31
32
33
/*----------------------------------------------------------------
34
---------------------------MAIN FUNCTION--------------------------
35
------------------------------------------------------------------*/
36
int main(void)
37
{
38
  DDRB = DDRB | 0b11111111;  // this is safer as it sets pins pb0- pb7 outputs
39
  PORTB = 0b00000000; // sets all LOW
40
  
41
42
int output[23] = {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
43
int i;  // initialize for loop variables
44
uint8_t segments[3200] = {0b00000000,0b00000000,0b00000000,0b00010000,0b00000000,0b00000000,0b00000000,0b00010000,0b00010000,0b00100000,0b00000000,0b00000000,0b00000000,0b00010000,0b00010000,0b00010000,0b00100000,0b00000000,0b00000000,0b00000000,0b00010000,0b00010000,0b00100000,0b00000000,0b00000000,0b00010000,0b00010000,0b00010000,0b00010000,0b00100000,0b00100000,0b00000000,0b00000000,0b00010000,0b00010000,0b00010000,0b00100000,0b00100000,0b00000000,0b00000000,0b00010000,0b00010000,0b00100000,0b00000000,
45
46
.......Array gekürzt ! vollständiges Array im anderen Beitrag... 3200 Elemente ...........
47
48
,0b00010000,0b00010000,0b00010000,0b00010000,0b00100000,0b00100000,0b00000000,0b00000000,0b00010000,0b00010000,0b00010000,0b00100000,0b00100000,0b00000000,0b00000000,0b00010000,0b00010000,0b00100000,0b00100000,0b00100000,0b00010000,0b00010000,0b00010000,0b00010000,0b00100000,0b00100000,0b00100000,0b00000000,0b00010000,0b00010000,0b00010000,0b00100000,0b00100000,0b00100000,0b00000000,0b00010000,0b00010000,0b00100000,0b00100000,0b00000000};
49
50
while(1)  // infinite loop
51
{  
52
  for (uint16_t ip=0;ip<3200;)  // for1
53
  {
54
    
55
  
56
  
57
    for (i=0; i<23; i++)  /// for2
58
    {
59
  
60
  
61
      ////////////////begin code
62
      REGISTER_BIT(PORTD,6) = output[i];
63
      shift_in();
64
      latch_in();
65
      PORTB = segments[ip];
66
      ip++;  /// 
67
68
69
70
      //////////////// END LVcode
71
72
    } // end for 2
73
    
74
  _delay_ms(2.0);
75
  
76
  } // end for 1
77
78
_delay_ms(50); 
79
80
} // end while
81
}  // end main
82
  
83
84
85
void shift_in(void)
86
{
87
  PORTB |= (1<<PB1);
88
  asm volatile ("nop");  /// 62,5ns delay
89
  PORTB &= ~(1<<PB1); 
90
  asm volatile ("nop");  /// 62,5ns delay
91
  
92
}
93
94
95
void latch_in(void)
96
{
97
  PORTG |= (1<<PG5);
98
  asm volatile ("nop");  /// 62,5ns delay
99
  PORTG &= ~( (1<<PG5)); 
100
  asm volatile ("nop");  /// 62,5ns delay
101
  
102
}

Kann da einmal jemand von euch über den Array Aufruf und die forLoops 
schauen ?

Danke :)

von hufnala (Gast)


Lesenswert?

Hi, was sagt denn der Simulator und was passiert wenn Du das über RS232 
raus debuggst?

//hufnala

von B. S. (bestucki)


Lesenswert?

Hoppla, hab bereits eine Antwort in deinem alten Thread geschrieben:
Beitrag "Re: Port Manipulation aus Array, mit auslassen eines Bit"

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.