79-ScopeScreen-Library (STM32F4)

Hier eine Library mit der man ein Analog-Oszi (mit Bildröhre) als Anzeigescreen benutzen kann. (mit Digital-Oszis funktioniert das nicht)

Im Internet gibt es viele solcher Projekte die unter dem Stichwort “Scope-Clock” laufen aber die meisten davon arbeiten zum zeichnen mit Vektor-Zeichensätzen.

Diese Version arbeitet wie ein “normales” LCD-Dislplay mit z.B. 200 x 200 Pixel Auflösung (max sind 256 x 256 Pixel möglich)

Es gibt Zeichenbefehle zum setzen, löschen von einem Pixel oder zum zeichnen von Linien, Kreisen, Texten usw.

Die Ausgabe erfolgt per DAC1 und DAC2. Das Oszi muss auf X/Y-Betrieb eingestellt werden. (X=DAC1 , Y=DAC2) Ein “Blanking-Signal” gibt es nicht.

Zur Software :

Je mehr Pixel gezeichnet werden müssen, desto langsamer wird die Bildwiederholfrequenz. Ich habe aus dem Grund die max. Anzahl an Pixel auf 3000 Begrenzt, die werden dann noch mit ca 70Hz dargestellt.

Nach jeder Änderung vom Displayinhalt muss einmal die Funktion
“UB_ScopeScreen_RedrawScreen” aufgerufen werden. Diese errechnet das neue Bild und die Ausgabe erfolgt dann per Timer-Interrupt im Hintergrund.

Bild :

scope_screen_02

Voraussetzungen :

1
2
Benutzte Module der CooCox-IDE : TIM, MISC
Benutzte Librarys : STM32_UB_DAC

Funktionen :

1
2
3
4
5
6
7
8
9
10
void UB_ScopeScreen_Init(void);                                                      // zum init vom ScopeScreen
void UB_ScopeScreen_Clear(void);                                                     // zum löschen vom Screen
void UB_ScopeScreen_SetPixel(uint16_t xpos, uint16_t ypos);                          // ein Pixel an X,Y setzen
void UB_ScopeScreen_ClearPixel(uint16_t xpos, uint16_t ypos);                        // ein Pixel an X, Y löschen
void UB_ScopeScreen_DrawLine(int16_t x1, int16_t y1, int16_t x2, int16_t y2);        // eine Linie zeichnen
void UB_ScopeScreen_DrawCircle(int16_t x0, int16_t y0, int16_t radius);              // einen Kreis zeichnen
void UB_ScopeScreen_DrawChar(uint16_t x, uint16_t y, uint8_t ascii, UB_Font *font);  // einen Buchstaben zeichnen
void UB_ScopeScreen_DrawString(uint16_t x, uint16_t y,char *ptr, UB_Font *font);     // einen String zeichnen
ErrorStatus UB_ScopeScreen_RedrawScreen(void);                                       // den ScopeScreen neu zeichnen
void UB_ScopeScreen_Testpattern(void);                                               // ein Testbild anzeigen

Beispiel :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
//--------------------------------------------------------------
// File     : main.c
// Datum    : 09.04.2014
// Version  : 1.0
// Autor    : UB
// EMail    : mc-4u(@)t-online.de
// Web      : www.mikrocontroller-4u.de
// CPU      : STM32F4
// IDE      : CooCox CoIDE 1.7.4
// GCC      : 4.7 2012q4
// Module   : CMSIS_BOOT, M4_CMSIS_CORE
// Funktion : Demo vom Scope-Screen
// Hinweis  : Diese zwei Files muessen auf 8MHz stehen
//              "cmsis_boot/stm32f4xx.h"
//              "cmsis_boot/system_stm32f4xx.c"
//--------------------------------------------------------------
 
#include "main.h"
#include "stm32_ub_scope_screen.h"
 
int main(void)
{
  SystemInit(); // Quarz Einstellungen aktivieren
 
  // init vom Scope-Screen
  UB_ScopeScreen_Init();
 
  // zum test ein Fadenkreuz zeichnen
  UB_ScopeScreen_DrawLine(0,SCOPE_SCREEN_MAXY/2,SCOPE_SCREEN_MAXX,SCOPE_SCREEN_MAXY/2);
  UB_ScopeScreen_DrawLine(SCOPE_SCREEN_MAXX/2,0,SCOPE_SCREEN_MAXX/2,SCOPE_SCREEN_MAXY);
 
  // zum test einen Kreis zeichnen
  UB_ScopeScreen_DrawCircle(SCOPE_SCREEN_MAXX/2,SCOPE_SCREEN_MAXY/2,35);
 
  // Screen neu zeichnen
  UB_ScopeScreen_RedrawScreen();
 
  while(1)
  {
    // nichts zu tun
  }
}

Hier die Library zum Download :

ub_stm32f4_scopescreen_v100

Hier der komplette CooCox-Projektordner zum Download :

Demo_79_ScopeScreen


Wie hat Dir dieser Artikel gefallen?

1 Stern2 Sterne3 Sterne4 Sterne5 Sterne (Noch keine Bewertungen)
Loading...

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.